Swift中as? String
与as String?
之间是否存在差异?如果是这样,有什么区别,什么时候应该使用一个与另一个?
答案 0 :(得分:35)
有一个微妙但重要的区别:
variable as? String
:variable
可以是任何类型,例如数组,整数等。如果是字符串,则转换为字符串,否则设置为nil
。 / p>
variable as String?
:variable
是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
所以:
as? Type
表示:如果可能,转换为此类型,否则评估为nil
as Type?
表示:强制转换为可选的Type
,因为我知道它是可选的Type
。据我所知,如果不是这样,就会生成运行时异常然而,真正的区别在于as?
和as
:前者是强制转换,后者是强制转换,如果不可能则导致运行时错误。
更新2015年12月14日自 Swift 1.2 以来,as
运营商有3种变体:
as?
尝试投射,如果施法失败则评估为nil
as!
是强制转换,如果转换失败,则会导致运行时异常(这是as
之前所做的事情)as
现在是一种特殊类型的强制类型,在转换为等效类型时使用,通常是桥接类型,例如Swift的String
和NSString
。答案 1 :(得分:4)
来自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)")
}
}
该示例首先尝试将downcast
当前项目设为Movie
。由于item
是MediaItem
个实例,因此它可能是Movie
;同样,它也可能是Song
,甚至只是一个基础MediaItem。
String?
optional value
包含值或包含nil
,表示该值已丢失。从此,
as? String
表示当您不知道自己要转发什么内容时,您假设它是String
,但可能是Integer
或{{1} }}或Float
或Array
Dictionary
表示它是as String?
,可能包含Optional Value
或String
值。答案 2 :(得分:0)
是的,有区别。
在第一种情况下,您正在对类型String
执行可选的强制转换。如果您尝试投射的对象确实是String
,则返回一个值,如果不是,则返回nil。
在第二种情况下,您正在强制转换为String?
类型。如果您要投射的值不是字符串,则会使程序崩溃。
答案 3 :(得分:0)
是,有差异。
variable as String?
向下转换为可选字符串。如果variable
不是String?
,则会导致运行时异常。
如果您的variable as? String
不是nil
类型,则variable
会返回String
,或者将variable
返回给字符串。这是条件向下广播,如果您不确定要进行向下投射,则需要使用此广告。