什么功能" as"在Swift语法中有哪些?

时间:2015-01-14 23:40:57

标签: swift

最近我偶然发现了一个我无法找到的语法:Swift语法中 as 是什么意思?

喜欢在:

var touch = touches.anyObject() as UITouch!

不幸的是,很难搜索像这样的单词,因此我没有在Apple的Swift Programming Language手册中找到它。也许有人可以引导我走向正确的通道?

为什么之后的元素总是有一个来表示打开一个Optional?

谢谢!

3 个答案:

答案 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