2016-10-03 57 views
7

我找不到更合適的標題。這是該方案: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

我覺得:'「| -0- [table] -0- |」'應該是'「| -0- [tableView] -0- |」' –

+0

不,沒關係。字典是'[「table」:self.tableView]'所以我將表視圖映射到'table'鍵下。 – Majster

+0

打印let視圖的實際類型 –

回答

1

這是斯威夫特3.

聲明字典明確一個問題:

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

在你的情況下,當你以這種方式let views = ["table": self.tableView]創建您收到類型爲[String:UIView?]和可選的值是主要問題。

UsageAnyAnyObject

夫特提供兩種特殊類型與非特異性類型的工作:

任何可以在所有代表任何類型的實例,包括函數 類型。

AnyObject可以表示任何類類型的實例。

+0

我知道這是一個問題。我很想知道爲什麼會發生這種情況。這不僅僅是在這裏的意見。當在CoreData中使用'Transformable'數據類型並且使用'[String:AnyObject]'而不是'[String:Any]'映射字典時,它也會發生。 – Majster