[swift] is & as、Any & AnyObject

前端之家收集整理的这篇文章主要介绍了[swift] is & as、Any & AnyObject前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

is & as

是用于swift 的类型检测

用简单的话来说就是:

is 是判断某个实例是否是某种类型的子类型
as 用于类型转换, 将父类类型的实例转换成子类类型,

as? 试图向下转换,如果不能成功则返回nil
as!试图向下转换,并强制解包

  1. class FatherClass {
  2. var name: String
  3. init(name: String) {
  4. self.name = name
  5. }
  6. }
  7.  
  8. class SubClassA: FatherClass {
  9. var proA: String
  10. init(name: String,proA: String) {
  11. self.proA = proA
  12. super.init(name: name)
  13. }
  14. }
  15.  
  16. class SubClassB: FatherClass {
  17. var proB: String
  18. init(name: String,proB: String) {
  19. self.proB = proB
  20. super.init(name: name)
  21. }
  22. }
  23.  
  24. let dic = [
  25. SubClassA(name: "One",proA: "A pro one"),SubClassA(name: "Two",proA: "A pro two"),SubClassB(name: "Three",proB: "B pro one"),SubClassA(name: "Four",proA: "A pro three"),SubClassA(name: "Five",proA: "A pro four")
  26. ]
  27.  
  28. for item in dic {
  29. if item is SubClassA {
  30. print("\(item.name) is SubClassA")
  31. } else if item is SubClassB {
  32. print("\(item.name) is SubClassB")
  33. }
  34. }
  35.  
  36. //One is SubClassA
  37. //Two is SubClassA
  38. //Three is SubClassB
  39. //Four is SubClassA
  40. //Five is SubClassA
  41.  
  42. for item in dic {
  43. if let subClassA = item as? SubClassA {
  44. print("SubClassA: '\(subClassA.name)',proA. \(subClassA.proA)")
  45. } else if let subClassB = item as? SubClassB {
  46. print("SubClassB: '\(subClassB.name)',proB. \(subClassB.proB)")
  47. }
  48. }
  49.  
  50. //SubClassA: 'One',proA. A pro one
  51. //SubClassA: 'Two',proA. A pro two
  52. //SubClassB: 'Three',proB. B pro one
  53. //SubClassA: 'Four',proA. A pro three
  54. //SubClassA: 'Five',proA. A pro four

Any & AnyObject

两种不确定类型

AnyObject可以代表任何class类型的实例。
Any可以表示任何类型,除了方法类型(function types)。

  1. var things = [Any]()
  2.  
  3. things.append(0)
  4. things.append(0.0)
  5. things.append(42)
  6. things.append(3.14159)
  7. things.append("hello")
  8. things.append((3.0,5.0))
  9. things.append(SubClassA(name: "Six",proA: "A pro five"))
  10. things.append(SubClassB(name: "Seven",proB: "B pro two"))
  11.  
  12. for thing in things {
  13. switch thing {
  14. case 0 as Int:
  15. print("zero as an Int")
  16. case 0 as Double:
  17. print("zero as a Double")
  18. case let someInt as Int:
  19. print("an integer value of \(someInt)")
  20. case let someDouble as Double where someDouble > 0:
  21. print("a positive double value of \(someDouble)")
  22. case is Double:
  23. print("some other double value that I don't want to print")
  24. case let someString as String:
  25. print("a string value of \"\(someString)\"")
  26. case let (x,y) as (Double,Double):
  27. print("an (x,y) point at \(x),\(y)")
  28. case let subClassA as SubClassA:
  29. print("a subclass called '\(subClassA.name)',proA. \(subClassA.proA)")
  30. case let subClassB as SubClassB:
  31. print("a subclass called '\(subClassB.name)',proB. \(subClassB.proB)")
  32. default:
  33. print("something else")
  34. }
  35. }
  36.  
  37. //zero as an Int
  38. //zero as a Double
  39. //an integer value of 42
  40. //a positive double value of 3.14159
  41. //a string value of "hello"
  42. //an (x,y) point at 3.0,5.0
  43. //a subclass called 'Six',proA. A pro five
  44. //a subclass called 'Seven',proB. B pro two

⚠️注意:在一个switch语句的case中使用强制形式的类型检查操作符(as,而不是 as?)来检查和转换到一个明确的类型。在 switch case 语句的内容中这种检查总是安全的。

猜你在找的Swift相关文章