最近我偶然发现了一个我无法找到的语法:Swift语法中 as 是什么意思?
喜欢在:
var touch = touches.anyObject() as UITouch!
不幸的是,很难搜索像这样的单词,因此我没有在Apple的Swift Programming Language手册中找到它。也许有人可以引导我走向正确的通道?
为什么之后的元素总是有一个!来表示打开一个Optional?
谢谢!
答案 0 :(得分:5)
as
keyword用于将对象转换为另一种类型的对象。为此,类必须可转换为该类型。
例如,这有效:
let myInt: Int = 0.5 as Int // Double is convertible to Int
然而,这并不是:
let myStr String = 0.5 as String // Double is not convertible to String
您还可以使用if-let
运算符执行可选投射(通常用于?
语句):
if let myStr: String = myDict.valueForKey("theString") as? String {
// Successful cast
} else {
// Unsuccessful cast
}
在您的情况下,touches
是(我在anyObject()
来电时假设)NSSet
。由于NSSet.anyObject()
会返回AnyObject?
,因此您必须将结果转换为UITouch
才能使用它。
在该示例中,如果anyObject()
返回nil,则应用程序将崩溃,因为您强制转换为UITouch!
(显式解包)。更安全的方式是这样的:
if let touch: UITouch = touches.anyObject() as? UITouch {
// Continue
}
答案 1 :(得分:2)
as
是一个将值转换为其他类型的运算符。
例如:
假设您有NSSet
个实例,其中一些元素的类型为Car
。
然后,如果你想从这个集合中获取任何对象:Car
,你应该调用anyObject()。
var someCar = set.anyObject() //here someCar is Optional with type AnyObject (:AnyObject?), because anyObject() -> AnyObject?
让我们想象一下当你需要从类型为Car
的集合中获取对象时的情况。
var realCar: Car = someCar as Car //here realCar is Optional with type Car (:Car?)
如果您确切知道someCar不是Optional(someCar!= nil),您可以执行以下操作:
var realCarAndNotAnOptional = someCar as Car! //here realCarAndNotAnOptional just have a type == Car
此处有更多信息:Swift: Type Casting
答案 2 :(得分:2)
某个类类型的常量或变量实际上可能是指 幕后子类的实例。你相信这是什么 在这种情况下,您可以尝试向下转换为类型的子类类型 演员(as)。
来自Swift Programming Language, Type Casting
为什么元素一如既往地拥有!表示打开一个Optional?
不是。它正试图向下转换为" Implicitly Unwrapped Optionals",请参阅Swift Programming Language, Types