2016-10-03 18 views
7

私はこれのより適切なタイトルを見つけることができませんでした。これはシナリオです:スウィフト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] 

をケースだ:

+0

私は思う: ' "| -O - [テーブル] - O- |"' 'でなければなりませんが、 "| -O - [のtableView] -O - |"' –

+0

んが、それは大丈夫です。辞書は '[" table ":self.tableView]'ですので、テーブルビューを 'table'キーの下にマップします。 – Majster

+0

letビューの実際のタイプを表示 –

答えて

1

このスウィフト3.

の問題が明示的に辞書を宣言しているが、主な問題です。

UsageAnyおよびAnyObject

スウィフトは、非特異的なタイプを操作するための2つの特別な種類の提供:

を任意関数 タイプを含む、全くタイプのインスタンスを表すことができます。

AnyObjectは、任意のクラスタイプのインスタンスを表すことができます。

ない
+0

これは問題であることが分かります。私はなぜこれが起こっているのか知りたいのです。それはただの意見ではありません。また、CoreDataに 'Transformable'データ型を使用し、' [String:Any] 'の代わりに' [String:AnyObject] 'で辞書をマップすることもあります。 – Majster

関連する問題