我该怎么用“?”在斯威夫特

时间:2014-11-19 08:13:32

标签: swift

例如

if let name = jsonDict["name"] as AnyObject? as? String {
    println("name is \(name)")
} else {
    println("property was nil")
}

我有以下问题:

jsonDict["name"] as AnyObject? as? StringjsonDict["name"] as? AnyObject as? String是或否相同?

jsonDict["name"] as AnyObject? as? StringjsonDict["name"] as AnyObject? as String?是或否相同?

我不知道as之间的区别?字符串和字符串?

2 个答案:

答案 0 :(得分:0)

jsonDict [“name”]为AnyObject?如?字符串与jsonDict [“name”]相同? AnyObject为?字符串是或否? - 不,后者毫无意义,你试图从AnyObject到String进行双重转换。此外,jsonDict [“name”]足以让编译器识别返回的类型,不需要对字符串进行任何转换。

jsonDict [“name”]为AnyObject?如? String与AnyObject的jsonDict [“name”]相同?作为字符串?是还是不是?。与第一种情况相同,进行双重演员毫无意义。而且,之间的区别是?就像那样?只有在对象可以成功转换为所需类型的情况下才会执行,如果不是这样,则不会对对象进行转换,从而避免崩溃。

答案 1 :(得分:-1)

asas?之间存在巨大差异。

as

as向下转换对象并强制解压缩结果,并且它并不真正关心对象的真实类型或任何故障安全过程。责任在于你,因此可能导致以下代码在运行时崩溃:

let jsonDict: Dictionary<String, AnyObject> = ["name": 32]
if let downcasted: String = jsonDict["name"] as String?  { ... } else { ... }

原因:它强行将Int32值转发为可选 String(= String?),并导致一次简单的崩溃 - 如果强制 - 解包失败,它会在运行时的每个场合都会导致崩溃。

  

只有当您100%确定转发失败后才能使用此解决方案。

因此,如果你的字典看起来像这样:

let jsonDict: Dictionary<String, String?> = ["name": nil]        
if let downcasted: String = jsonDict["name"] as String? { ... } else { ... }

else-branch 将被执行,因为String?nil,当您用任何字符串替换nil时(例如"My Name" }}如果 {{ 1}},当值不是String时,我会在每种情况下突出显示崩溃。

nil

as?可选地向下转换对象,如果向下转换过程失败则返回as?。该解决方案可帮助您在运行时检查donwcasting是否成功,而不会发生任何崩溃:

nil

在这种情况下,将执行 else-branch 并且您的应用程序可以继续执行,因为实际的let jsonDict: Dictionary<String, AnyObject> = ["name": 32] if let downcasted: String = jsonDict["name"] as? String { ... } else { ... } 值无法下载到Int32 - 如果您的 value String(例如String),然后 if-branch 将在运行时执行。

  

如果您不确定实际对象的类型在运行时是否存在且转发过程可能会失败,则必须使用此解决方案。


注意:我建议您阅读有关type-castingoptional-chaining的官方文档,以便更好地了解整个过程。