Swift 我应该如何使用“引用”&引用;迅速地

Swift 我应该如何使用“引用”&引用;迅速地,swift,Swift,比如说 if let name = jsonDict["name"] as AnyObject? as? String { println("name is \(name)") } else { println("property was nil") } 我有以下问题: jsonDict[“name”]作为任何对象?像字符串与jsonDict[“name”]相同吗?有什么东西吗?字符串是还是否 jsonDict[“name”]作为任何对象?像字符串与任何对象的jsonDict[

比如说

if let name = jsonDict["name"] as AnyObject? as? String {
    println("name is \(name)")
} else {
    println("property was nil")
}
我有以下问题:

jsonDict[“name”]作为任何对象?像字符串
jsonDict[“name”]相同吗?有什么东西吗?字符串
是还是否

jsonDict[“name”]作为任何对象?像字符串
与任何对象的jsonDict[“name”]相同吗?作为字符串?是还是否

我不知道两者的区别是什么?字符串和as字符串

jsonDict[“name”]作为任何对象?像字符串与jsonDict[“名称”]相同,因为?有什么东西吗?字符串是或否不,后者没有意义,您正在尝试从任意对象到字符串进行双重转换。此外,jsonDict[“name”]足以让编译器识别返回的类型,您不需要对字符串进行任何转换


jsonDict[“名称”]作为任何对象?像字符串是否与jsonDict[“名称”]和任何对象相同?作为字符串?是还是不是?。与第一种情况相同,进行双重铸造没有什么意义。此外,两者之间的区别是什么?那是什么?将仅在对象可以成功转换为所需类型的情况下执行,如果不是这种情况,则不会强制转换对象,从而避免崩溃。

as和
as之间存在巨大差异。

as
as
每次都会向下投射对象并强制展开结果,它实际上并不关心对象的真实类型或任何故障保护过程。因此,您有责任在运行时导致以下代码崩溃:

let jsonDict: Dictionary<String, AnyObject> = ["name": 32]
if let downcasted: String = jsonDict["name"] as String?  { ... } else { ... }
else分支将被执行,因为
String?
nil
,当您将
nil
替换为字典中的任何字符串(例如
“我的名字”
)时,if分支将按预期在运行时执行–如果值不是可选的
字符串
,则,当值不是
nil
时,就会发生崩溃,正如我在上面强调的那样

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

let jsonDict: Dictionary<String, AnyObject> = ["name": 32]
if let downcasted: String = jsonDict["name"] as? String  { ... } else { ... }
让jsonDict:Dictionary=[“name”:32]
如果向下浇铸:String=jsonDict[“name”]as?字符串{…}其他{…}
在这种情况下,else分支将被执行,而您的应用程序可以继续运行,因为实际的
Int32
值无法向下转换为
String
——如果您的值是
String
(例如
“我的名字”
),那么if分支将在运行时执行

当您不确定实际对象的类型在运行时是哪种类型,并且向下转换过程有可能失败时,必须使用此解决方案



注:我建议阅读官方文件,更好地了解整个过程。

要想弄清楚为什么有些人在毫无线索的情况下否决投票,这总是很有挑战性的,但我想他们心里有一个很好的理由。愿上帝保佑这些天才
let jsonDict: Dictionary<String, AnyObject> = ["name": 32]
if let downcasted: String = jsonDict["name"] as? String  { ... } else { ... }