2016-02-14 54 views
2

我是swift的新手,正试图学习关键字'is'和'as'的概念。我理解'是'是类型检查运算符(用于检查某个变量是否属于某个子类),而'as'是类型转换运算符(用于将变量向下转换为其子类)。但是,我的问题是,如果有两个关键字可以互换使用的地方,以及有些地方是他们不能的地方。预先感谢任何帮助!swift中“is”和“as”关键字的区别

回答

4

以下是基本一致:

if let _ = myObject as? SomeClass ... 
if myObject is SomeClass ... 

唯一真正的区别是,as将其转换为合成类,以供再使用。在上面的代码中,我使用了占位符“_”,这意味着我并不真的想要结果。由于构造if let,您会发现在Swift中不像is那样使用is。例如:

if let mySomeClass = myObject as? SomeClass { 
    // Now I know mySomeClass is a SomeClass so I can use it. 
} 
+0

在相同的情况下,您可能会发现'is',在这种情况下,您可以在其他语言中找到隔离的'instanceof',而不会立即匹配downcast。 'if-let-as?'结合了这两个操作。 – Thilo

+0

反过来说,如果其他语言没有首先进行'instanceof'检查就会无条件下传,你会发现'as!'。 – Thilo

3

由于从Objective C的背景新手到斯威夫特,这里是写铸造我常用的方法,使用的Objective-C中instanceof类似的结构,随后通过浇铸:

if (someObject is someClass) { 
    (someObject as! someClass).someFunc() 
} 

or 

if (someObject is someClass) { 
    let anObject = (someObject as! someClass) 
    anObject.someFunc() 
} 

它可以与Optional Binding被简化:

if let anObject = someObject as? someClass { 
    anObject.someFunc() 
} 

有些人喜欢重用对象名称(不是我ntroducing新名称代码):

if let someObject = someObject as? someClass { 
    someObject.someFunc() 
} 

如果if-let-as?身体只是一个函数调用,它可以进一步与Optional Chaining简化:

(someObject as? someClass)?.someFunc() 

当我第一次从对象 - 迁移到Swift,我让Xcode编译器建议纠正我关于可选代码的语法错误。我通常这样结束了:

(someObject as! someClass).someFunc() 

然而,当我学习苹果的“雨燕编程语言(雨燕3.1)”电子书,我发现这可能是一个陷阱。下面是“铸型操作员”部分的文字部分:

作为!操作员将表达式强制转换为指定的类型。 as!运算符返回指定的类型的值,而不是可选类型。如果转换失败,则会引发运行时错误。 x的行为! T与(x??T)!的行为相同。

因此,当someObject不是someClass,运行时错误会使我的应用程序崩溃。

相关问题