Swift value()でBoolとInt取得、アップキャストで型は決められない?

概要

MPMediaItemのプロパティをvalue()で取得。
Optional(0)はアップキャストでBoolかIntを決められない。

コード

import MediaPlayer

func changeAny(value:Any) {
    print("- Original \(value)")
    if let value = value as? Bool {
        print("- Bool \(value)")
    }
    else if let value = value as? String {
        print("- String \(value)")
    }
    else if let value = value as? Int {
        print("- Int \(value)")
    }
}

let boolValue = true
let intValue = 0
let item = MPMediaItem()

print("Bool:\(boolValue)")
changeAny(value: boolValue)
print("Int:\(intValue)")
changeAny(value: intValue)
print("MPMediaItemPropertyIsCloudItem:\(item.isCloudItem)")
changeAny(value: item.value(forKey: MPMediaItemPropertyIsCloudItem))
print("MPMediaItemPropertyPlayCount:\(item.playCount)")
changeAny(value: item.value(forKey: MPMediaItemPropertyPlayCount))

実行結果

Bool:true
- Original true
- Bool true
Int:0
- Original 0
- Int 0
MPMediaItemPropertyIsCloudItem:false
- Original Optional(0)
- Bool false
MPMediaItemPropertyPlayCount:0
- Original Optional(0)
- Bool false

Boolになる。
Optional(0)なので無理なのか。

changeAny()内as? Boolとas? Intの順番を逆にする

func changeAny(value:Any) {
    print("- Original \(value)")
    if let value = value as? Int {
        print("- Int \(value)")
    }
    else if let value = value as? String {
        print("- String \(value)")
    }
    else if let value = value as? Bool {
        print("- Bool \(value)")
    }
}

実行結果

Bool:true
- Original true
- Bool true
Int:0
- Original 0
- Int 0
MPMediaItemPropertyIsCloudItem:false
- Original Optional(0)
- Int 0
MPMediaItemPropertyPlayCount:0
- Original Optional(0)
- Int 0

Intになる。

Swift

Posted by shi-n