从AnyObject(NSString)获取string

我正在阅读一个plist键(带有n个NSDictionaries的NSArray):

let regionsToMonitor = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String,AnyObject>> 

现在我重复一遍:

  for regionToMonitor in regionsToMonitor { 

现在我想获取regionToMonitor的uuidString

在ObjC: NSString *uuidString = regionToMonitor[@"uuidString"];

在swift中我试试: let uuidString = regionToMonitor["uuid"]!.stringValue;

上面的编译,但string总是nil快速。 regionToMonitor["uuid"]使用时没有!.stringValue在println工作正常

我如何得到一个有效的Swift.String在这里?

我想把它传递给NSUUID!


我也试过了

let uuidString:String = regionToMonitor["uuid"]
=> AnyObject不能转换为String

let uuidString = regionToMonitor["uuid"] as String
=>找不到接受提供参数的'subscript'的重载

let uuidString = regionToMonitor["uuid"];
=>'AnyObject?' 不能被隐式地转换为“String”; 你的意思是用“as”强迫低调?

我以丑陋的结局结束了:

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

没有警告,没有错误,没有运行时错误

我发现这为我工作

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

编辑:这是一个较旧的快速版本的答案

请使用接受的答案。

AnyObject? 是可选的,因为字典可能包含或不包含“uuid”键的值。 要获得可选的价值,你必须解开它。 请参阅文档中的可选项。

处理一个可选的最安全的方法是把它放在一个条件语句。

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

如果您绝对确信字典将始终包含此键/值对,则可以使用隐式解包的可选( !后缀):

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

在这种情况下,如果没有键值,你的应用程序将崩溃。

如果你使用! 很多,看起来你总是在大喊大叫……这可能有助于说明为什么你应该谨慎使用它,如果有的话。 🙂

我find了一个工作的解决scheme,编译没有警告和这样的:

 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 } 

NSBundleinfoDictionary返回一个NSArrayNSDictionary ,而不是Swift.ArraySwift.Dictionary 。 虽然,它们应该是可以互换的,但也许它们不是我们的。

我不知道我的解决scheme是有效的,但不是在这里。

 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") } 

把事情简单化:

 let uuidString = "\(regionToMonitor["uuid"])"