我是swift的新手,正试图学习关键字'is'和'as'的概念。我理解'是'是类型检查运算符(用于检查某个变量是否属于某个子类),而'as'是类型转换运算符(用于将变量向下转换为其子类)。但是,我的问题是,如果有两个关键字可以互换使用的地方,以及有些地方是他们不能的地方。预先感谢任何帮助!swift中“is”和“as”关键字的区别
2
A
回答
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.
}
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
,运行时错误会使我的应用程序崩溃。
相关问题
- 1. swift中的“as”关键字是什么
- 2. IsAssignableFrom,IsInstanceOfType和is关键字有什么区别?
- 3. 关键字:is和==有什么区别python
- 4. 什么是C#'is'和'as'关键字的Java等价物?
- 5. pop()和del关键字的区别
- 6. (as!SKView?)和(as?SKView)之间的区别
- 7. 元“关键字”和“关键字”有区别
- 8. dict.keys()中的关键字与关键字有什么区别?
- 9. 用于PL/SQL的IS和AS关键字Oracle函数或程序创建
- 10. oracle sql中的join关键字和inner join关键字有什么区别?
- 11. Laravel Eloquent AS关键字
- 12. 实例化“AS”关键字
- 13. SQL关键字之间的区别
- 14. SQL中Top和Limit关键字的区别
- 15. Python:`is`和`==`之间的区别?
- 16. 使用带有“null”关键字的“is”关键字c#7.0
- 17. “关键部分”,“关键区域”和“约束执行区域”之间的区别
- 18. XSL中as =“element()+”和as =“element()*”有什么区别?
- 19. C#“is”关键字的使用模式
- 20. Swift“with”关键字
- 21. Swift shell和Swift之间的区别
- 22. Java中是否有任何关键字与C#中的'AS'关键字相似?
- 23. 太阳黑子关键字和全文的区别
- 24. CSS关键字和属性之间的区别?
- 25. 关键字'DECLARE'语法不正确。关键字“AS”
- 26. 'end'和'end as'有什么区别
- 27. Swift dictionary'else'的关键字?
- 28. Swift中nil和()之间的区别
- 29. Swift中下标和函数的区别
- 30. Swift中Printable和DebugPrintable之间的区别
在相同的情况下,您可能会发现'is',在这种情况下,您可以在其他语言中找到隔离的'instanceof',而不会立即匹配downcast。 'if-let-as?'结合了这两个操作。 – Thilo
反过来说,如果其他语言没有首先进行'instanceof'检查就会无条件下传,你会发现'as!'。 – Thilo