Swift中的as? Stringvs. 之间有区别as String?吗?如果是这样,有什么区别,什么时候应该使用一个与另一个?
Ant*_*nio 35
有一个微妙但重要的区别:
variable as? String:variable可以是任何类型,例如数组,整数等.如果是字符串,则转换为字符串,nil否则设置为字符串.
variable as String?:variable是a String?,但存储在opaque类型中,例如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
Run Code Online (Sandbox Code Playgroud)
所以:
as? Type 表示:如果可能,转换为此类型,否则评估为 nilas Type?意思是:强制转换为可选项Type,因为我知道它是可选的Type.据我所知,如果不是这样,就会生成运行时异常但是,真正的区别在于as?和as:前者是一个强制转换的尝试,后者是强制转换,如果不可能则导致运行时错误.
更新2015年12月14日自Swift 1.2以来,as运营商有3种变体:
as?nil如果施法失败,则试图施放,评估as!是一个强制转换,如果转换失败导致运行时异常(这是as以前的做法)as现在是一种特殊类型的强制转换,在转换为等效类型时使用,通常是桥接类型,例如Swift String和NSString.从The Swift Programming Language书中,
as是一个类型转换运算符,我们用来向下转换为subclass并且as?用于可选形式,当我们不确定 是否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)")
}
}
Run Code Online (Sandbox Code Playgroud)该示例首先尝试downcast将当前项目作为Movie. 因为item是一个MediaItem实例,它可能是一个Movie; 同样,它也可能是一个Song,甚至只是一个基本的 MediaItem。
String?一个optional value要么包含一个值,要么包含nil来指示该值丢失。由此,
as? String意味着当你不知道你在贬低什么时,你假设它是 a String,但它可能是 meInteger或FloatorArray或Dictionaryas String?意味着它是一个Optional Value,它可能包含一个String或Nil值。