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?]
,可选值是主要问题。
Any
和AnyObject
用法 。
Swift提供了两种特殊types来处理非特定types:
任何可以表示任何types的实例,包括函数types。
AnyObject可以表示任何类types的实例。