从AnyObject(NSString)获取String

时间:2014-06-03 00:20:05

标签: ios nsstring swift

我正在读一个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;

以上编译但是字符串在swift中总是nil。 {!1}}在没有!.stringValue的情况下使用regionToMonitor["uuid"]

如何在这里获得有效的Swift.String?

我正在尝试将其传递给NSUUID!


我也试过

println
=&GT; AnyObject不能转换为String

let uuidString:String = regionToMonitor["uuid"]
=&GT;无法找到&#39;下标&#39;接受提供的参数

let uuidString = regionToMonitor["uuid"] as String
=&GT; &#39; AnyObject&#39?;不能隐含地向下转换为&#39; String&#39 ;;你的意思是使用&#39;作为&#39;迫使低垂?

8 个答案:

答案 0 :(得分:44)

我最终得到了丑陋的一句话:

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

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

答案 1 :(得分:11)

我发现这对我有用

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

编辑:这是旧版快速版的答案

请使用接受的答案。

答案 2 :(得分:3)

AnyObject?是可选的,因为字典可能包含也可能不包含&#34; uuid&#34;键。要获得可选的值,您必须解开它。请参阅文档中的Optionals

处理可选项的最安全方法是将其置于条件语句中。

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

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

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

在这种情况下,如果该键没有值,您的应用就会崩溃。

如果你经常使用!,看起来你总是大喊大叫...这可能有助于说明为什么你应该谨慎使用它,如果有的话。 :)

答案 3 :(得分:2)

我找到了一个可行的解决方案,它可以在没有警告的情况下进行编译等等:

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会返回NSArrayNSDictionary,而非Swift.ArraySwift.Dictionary。虽然,它们应该是可以互换的,但也许它们并不像我们那样。

答案 4 :(得分:1)

我不确定我的解决方案是否有效,但现在不是。

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

希望它有所帮助。

答案 5 :(得分:0)

您也可以使用

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

它与你正在做的结果相同,但恕我直言的意图更明确。 as操作员力量无论如何都会展开,因此将感叹号放在后面会感觉多余。将问号置于字典下标后面,可以清楚地表明您正在链接一个可选项。

答案 6 :(得分:0)

如果您确定要使用未包装的值,可以使用以下任何一种:

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

甚至是这样:

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

答案 7 :(得分:-1)

保持简单:

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