私はこれのより適切なタイトルを見つけることができませんでした。これはシナリオです:スウィフト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))
}
}
はEDIT:明示的な型注釈を入れていない場合、コンパイラは、この特定のケースで[String: UITableView?]
を推測します。
今、私は明示的にコンパイラはviews
は(コメントアウトthingieのような)タイプ[String: Any]
のこのコードがクラッシュしていると私は私にこのメッセージと一緒に中指を与える小ぎれいなクラッシュを得ることを知らせていない場合:
-[_SwiftValue nsli_superitem]: unrecognized selector sent to instance 0x60000044a560
Swift 2.xからの移行後に、このようなことが起こっています。誰かがその光景を照らしてくれますか?なぜこうなった?このようなことを避けるには?どのようにそのようなクラッシュの起源を発見するのですか(いくつかは追跡することが非常に困難です)?あなたは、このように作成するときlet views = ["table": self.tableView]
あなたは[String:UIView?]
あるタイプとオプションの値を受け取り、あなたに
let views: [String:UIView] = ["table":self.tableView]
をケースだ:
私は思う: ' "| -O - [テーブル] - O- |"' 'でなければなりませんが、 "| -O - [のtableView] -O - |"' –
んが、それは大丈夫です。辞書は '[" table ":self.tableView]'ですので、テーブルビューを 'table'キーの下にマップします。 – Majster
letビューの実際のタイプを表示 –