安全的向下压力方式

时间:2016-03-31 19:25:39

标签: ios swift

是否有"安全"写这个可以防止运行时错误的方法吗?

for posts in resultsArray as! [AnyObject] {
    //do stuff
}

我觉得if-let或guard声明会在这里起作用,我不知道如何使用for-in循环来完成这项工作。

3 个答案:

答案 0 :(得分:2)

  • as用于向上转换和类型转换为桥接类型
  • as?用于安全投射,如果失败则返回nil
  • as!用于强制施放,如果失败则崩溃

安全向下转发

for posts in resultsArray as? [AnyObject] {
    //do stuff
}

posts将是AnyObject类型的变量吗?如果基础类型不是它将会无害地分配nil

不安全的向下转发

for posts in resultsArray as! [AnyObject] {
    //do stuff
}

这也会导致帖子的类型为AnyObject?但如果基础类型是其他类型,它将crash

Reference

答案 1 :(得分:1)

您可以使用as?在for-in-loop中进行转换。

for result in resultsArray {
   if let post = result as? AnyObject {
      //do stuff
   } else {
      //do other stuff
   }
}

通过这种方式,您可以选择在演员表失败时会发生什么。

答案 2 :(得分:0)

为什么要将resultsArray投射到[AnyObject]?将它投射到正确的类型不是更好吗?

所以给出

class Post { }
let resultsArray: Any = [Post(), Post()]

你可以写这个

func doSomething(resultsArray: Any) {
    guard let posts = resultsArray as? [Post] else { return }
    for post in posts  {
        print(post)
    }
}