参见英文答案 >
Downcasting in Swift with as and as?3
是否有区别? String vs. String在斯威夫特?如果是这样,有什么区别,何时应该使用一个与另一个?
是否有区别? String vs. String在斯威夫特?如果是这样,有什么区别,何时应该使用一个与另一个?
解决方法
有一个微妙但重要的区别:
>变量为? String:变量可以是任何类型,如数组,整数等.如果是字符串,则转换为字符串,否则设置为nil.
> variable as String?:variable是一个String?,但存储在一个不透明的类型中,例如AnyObject?,或者它是一个不可选的字符串.如果它不同,则会生成运行时异常.
一些例子:
var x: AnyObject? = "Test" x as String? // OK,the result is an optional string x as? String // OK,evaluates to an optional string "string" as String? // OK,evaluates to optional string x as? Int // OK,evaluates to nil,it's not an Int x as Int? // Runtime exception,it's not castable to optional Int
所以:
作为?类型意味着:如果可能,转换为此类型,否则评估为零
>作为类型?意味着:转换为可选类型,因为我知道它是一个可选的类型.我明白如果不是这样,就会生成运行时异常
然而,真正的区别在于?而作为:前者是试图投射,后者是强制投射,如果不可能导致运行时错误.
更新2015年12月14日由于Swift 1.2,作为运算符有3个变体:
作为?是试图投射,如果投射失败,评估为零作为!是强制转换,导致运行时异常,如果cast失败(这是以前做过的)现在是一种特殊类型的转换,用于当转换为等效类型时,通常是桥接类型,例如Swift的String和NSString.