web-dev-qa-db-ja.com

AnyObject(NSString)からStringに取得します

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」を使用するつもりでしたか?

17
Daij-Djan

私はendedい行になりました:

var uuidString:String = regionToMonitor["uuid"] as! String

警告なし、エラーなし、ランタイムエラーなし

44
Daij-Djan

私はこれが私のために働くことがわかった

var uuidString: String? = regionToMonitor["uuid"] as AnyObject? as? String

編集:これは古いSwiftバージョンの答えでした

受け入れられた回答を使用してください。

11
Amitay

辞書には「uuid」キーの値が含まれている場合と含まれていない場合があるため、AnyObject?はオプションです。オプションの値を取得するには、unwrapにする必要があります。ドキュメントの オプション を参照してください。

オプションを処理する最も安全な方法は、オプションステートメントを条件ステートメントに入れることです。

if let uuidString = regionToMonitor["uuid"] {
    // do something with uuidString
}

ディクショナリに常にこのキー/値のペアが含まれることを確信している場合は、暗黙的にラップされていないオプション(!サフィックス)を使用できます。

println("UUID: \(regionToMonitor["uuid"]!)")       

この場合、キーの値がないとアプリがクラッシュします。

!を頻繁に使用すると、常に大声で叫んでいるように見えます。 :)

3
rickster

私は警告などなしでコンパイルする実用的なソリューションを見つけました:

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.ArraySwift.Dictionaryではなく、NSArrayNSDictionaryを返します。しかし、それらは交換可能であるべきですが、多分彼らは私たちのようではありません。

2
Leandros

私の解決策が効果的かどうかはわかりませんが、ここにあります。

var uuidVar = regionToMonitor["uuid"]
var uuidString:String = "\(uuidVar)"

それが役に立てば幸い。

1
ACengiz

使用することもできます

var uuidString = regionToMonitor["uuid"]? as String

それはあなたがやっていることと同じ結果をもたらしますが、私見の意図はより明確です。とにかくas演算子は強制的にアンラップするため、感嘆符を背後に置くことは冗長です。辞書の添え字の後ろに疑問符を置くと、オプションを連鎖していることが明確になります。

0
Mike Seghers

ラップされていない値が必要な場合は、次のいずれかを使用できます。

var uuidString:String! = regionToMonitor["uuid"]
var uuidString = regionToMonitor["uuid"] as String!

またはこれさえ:

if var uuidString = regionToMonitor["uuid"] {
    println("\(uuidString) has been unwrapped")
}
0
ggomeze