从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 }
NSBundle
的infoDictionary
返回一个NSArray
和NSDictionary
,而不是Swift.Array
或Swift.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"])"