我找不到更合適的標題。這是該方案:Swift 3奇怪的崩潰(類型推斷)
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))
}
}
編輯:如果你不把一個明確的類型註釋,編譯器將在這種特殊情況下推斷[String: UITableView?]
。
現在,如果我不明確讓編譯器知道views
是[String: Any]
型的(如註釋掉的thingie)這段代碼崩潰,我得到一個整潔的小碰撞給了我一箇中指與此消息一起:
-[_SwiftValue nsli_superitem]: unrecognized selector sent to instance 0x60000044a560
這樣的事情發生在從Swift 2.x遷移後到處都在發生。有人可以談談這個問題嗎?這是爲什麼發生?如何避免這樣的事情?如何發現這種崩潰的起源(有些很難追查)?
我覺得:'「| -0- [table] -0- |」'應該是'「| -0- [tableView] -0- |」' –
不,沒關係。字典是'[「table」:self.tableView]'所以我將表視圖映射到'table'鍵下。 – Majster
打印let視圖的實際類型 –