Plistキー(NSDictionariesがn個のNSArray)を読んでいます:
let regionsToMonitor = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String,AnyObject>>
今、私はそれを繰り返します:
for regionToMonitor in regionsToMonitor {
そして今、私はregionToMonitorのuuidStringを取得したい
objC:NSString *uuidString = regionToMonitor[@"uuidString"];
in Swift試します:let uuidString = regionToMonitor["uuid"]!.stringValue;
上記はコンパイルされますが、Swiftでは文字列は常にnil
です。 regionToMonitor["uuid"]
を!.stringValueなしで使用すると、println
で正常に動作します
ここで有効なSwift.Stringを取得するにはどうすればよいですか?
NSUUIDに渡そうとしています!
私も試しました
let uuidString:String = regionToMonitor["uuid"]
=> AnyObjectは文字列に変換できません
let uuidString = regionToMonitor["uuid"] as String
=>指定された引数を受け入れる 'subscript'のオーバーロードが見つかりませんでした
let uuidString = regionToMonitor["uuid"];
=> 'AnyObject?' 「String」に暗黙的にダウンキャストすることはできません。ダウンキャストを強制するために「as」を使用するつもりでしたか?
私はendedい行になりました:
var uuidString:String = regionToMonitor["uuid"] as! String
警告なし、エラーなし、ランタイムエラーなし
私はこれが私のために働くことがわかった
var uuidString: String? = regionToMonitor["uuid"] as AnyObject? as? String
編集:これは古いSwiftバージョンの答えでした
受け入れられた回答を使用してください。
辞書には「uuid」キーの値が含まれている場合と含まれていない場合があるため、AnyObject?
はオプションです。オプションの値を取得するには、unwrapにする必要があります。ドキュメントの オプション を参照してください。
オプションを処理する最も安全な方法は、オプションステートメントを条件ステートメントに入れることです。
if let uuidString = regionToMonitor["uuid"] {
// do something with uuidString
}
ディクショナリに常にこのキー/値のペアが含まれることを確信している場合は、暗黙的にラップされていないオプション(!
サフィックス)を使用できます。
println("UUID: \(regionToMonitor["uuid"]!)")
この場合、キーの値がないとアプリがクラッシュします。
!
を頻繁に使用すると、常に大声で叫んでいるように見えます。 :)
私は警告などなしでコンパイルする実用的なソリューションを見つけました:
var regions = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String, AnyObject>>
for region in regions {
let dict: NSDictionary = region
var uuid = dict["uuidString"] as String
}
infoDictionary
からのNSBundle
は、Swift.Array
やSwift.Dictionary
ではなく、NSArray
とNSDictionary
を返します。しかし、それらは交換可能であるべきですが、多分彼らは私たちのようではありません。
私の解決策が効果的かどうかはわかりませんが、ここにあります。
var uuidVar = regionToMonitor["uuid"]
var uuidString:String = "\(uuidVar)"
それが役に立てば幸い。
使用することもできます
var uuidString = regionToMonitor["uuid"]? as String
それはあなたがやっていることと同じ結果をもたらしますが、私見の意図はより明確です。とにかくas
演算子は強制的にアンラップするため、感嘆符を背後に置くことは冗長です。辞書の添え字の後ろに疑問符を置くと、オプションを連鎖していることが明確になります。
ラップされていない値が必要な場合は、次のいずれかを使用できます。
var uuidString:String! = regionToMonitor["uuid"]
var uuidString = regionToMonitor["uuid"] as String!
またはこれさえ:
if var uuidString = regionToMonitor["uuid"] {
println("\(uuidString) has been unwrapped")
}