Swift:区别为String? 作为? string
as? String
有区别as? String
as? String
与as String?
在Swift中? 如果是这样,有什么区别,我应该什么时候使用一个与另一个?
有一个微妙但重要的区别:
-
variable as? String
variable as? String
:variable
可以是任何types,例如数组,整数等。如果string是string,则转换为string,否则设置nil
。 -
variable as String?
:variable
是一个String?
,但存储在一个不透明的types,如AnyObject?
,或者它是一个非可选的string。 如果不同,则会生成运行时exception。
一些例子:
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
所以:
-
as? Type
as? Type
意思是:如果可能的话转换为这种types,否则评估nil
-
as Type?
意思是:转换为一个可选的Type
,因为我知道这是一个可选的Type
。 我明白,如果不是这样,就会产生运行时exception
但真正的区别在于as?
as
:前者是试图施放,后者是强制施放,如果不可能造成运行时错误。
更新2015年12月14日自Swift 1.2以来,有3个变种的运算符:
-
as?
是一个试图施放,如果施法失败,评估nil
-
as!
是一个强制转换,导致运行exception,如果转换失败(这是以前所做的) - 现在是一种特殊types的types转换,通常是桥接types,比如Swift的
String
和NSString
。
从The Swift Programming Language
书中,
-
as
一个types转换运算符 ,我们用它来贬低到subclass
和as?
被用于一个可选的forms,当我们不确定是否downcast
会成功。 考虑下面的例子for item in library { if let movie = item as? Movie { println("Movie: '(movie.name)', dir. (movie.director)") } else if let song = item as? Song { println("Song: '(song.name)', by (song.artist)") } }
该示例首先尝试将当前项目下载为Movie
。 因为item
是一个MediaItem
实例,所以它可能是一个Movie
; 同样,它也有可能是一首Song
,甚至只是一个基本的媒体项目。
-
String?
一个optional value
包含一个值或者包含nil
来表示缺失值。
由此,
-
as? String
as? String
意思是当你不知道你是什么意思,你假设为一个String
,但它可能是我的Integer
或Float
或Dictionary
-
as String?
意味着它是一个Optional Value
,它可能包含一个String
或Nil
值。
是,有一点不同。
在第一种情况下,您正在对String
types进行可选转换。 这将返回一个值,如果你试图施放的对象确实是一个String
否则为零。
在第二种情况下,您正在强制转换为String?
typesString?
。 如果您正在转换的值不是string,则会导致程序崩溃。
是的 ,有差别。
variable as String?
downcast为可选的String.If variable
不是String?
它会导致运行时exception。
而variable as? String
如果你的variable
不是String
types或者将downcast variable
返回给String,那么variable as? String
将返回nil
。 这是有条件的向下转换 ,如果你不确定下来你需要使用这个。