Swift 3奇怪的崩溃(types推断)

我找不到一个更合适的标题。 这是场景:

final class Something : UIViewController { fileprivate var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() self.tableView = UITableView(frame: CGRect.zero, style: .plain) self.tableView.translatesAutoresizingMaskIntoConstraints = false //Delegate, register cell, ... self.view.addSubview(self.tableView) let views/*: [String: Any]*/ = ["table": self.tableView] //THIS LINE NOW WILL CRASH self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|-0-[table]-0-|", options: [], metrics: nil, views: views)) self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[table]-0-|", options: [], metrics: nil, views: views)) } } 

编辑 :如果你不把明确的types注释编译器将推断[String: UITableView?]在这种特殊情况下。

现在,如果我没有明确地让编译器知道views的types是[String: Any] (就像注释掉的东西),那么这个代码会崩溃,我得到一个整齐的小崩溃,给我一个中指和这个消息:

 -[_SwiftValue nsli_superitem]: unrecognized selector sent to instance 0x60000044a560 

像这样的事情发生后,从Swift 2.x迁移到处都在发生。 有人可以谈谈这个问题吗? 为什么发生这种情况? 如何避免这样的事情? 如何发现这种崩溃的起源(有些很难追查)?

这是Swift 3的一个问题。

明确声明字典:

 let views: [String:UIView] = ["table":self.tableView] 

在你用这种方式创build的情况下, let views = ["table": self.tableView]得到的types是[String:UIView?] ,可选值是主要问题。

AnyAnyObject 用法 。

Swift提供了两种特殊types来处理非特定types:

任何可以表示任何types的实例,包括函数types。

AnyObject可以表示任何类types的实例。