2016-09-28 26 views
0
protocol textingprotocol : class { 
    func didEnterText (text:String) 
} 

class secondViewController: UIViewController {  
weak var delegate:textingprotocol? 

@IBOutlet weak var txtField: UITextField? 

@IBAction func dismissButton(sender: UIButton) { 

    delegate!.didEnterText(txtField?.text) // A: doesn't work 
    delegate!.didEnterText(txtField?.text!) // B: doesn't work 
    delegate!.didEnterText((txtField?.text)!) // C: works 

} 

答:我沒有在做可選鏈和行只會工作,如果文本有一個值,如果沒有那麼它會優雅地失敗? 但它給出:當我進行可選鏈接時,爲什麼會出現錯誤?

可選類型'String?'的值不打開;你的意思是使用 '!'要麼 '?'?

B:即使當我給出的編譯器錯誤的上面,還有我解開它,它仍然是不滿意它希望它像C.我的理解與?我已經解開txtField並與!我已解開文字,仍然困惑爲什麼它不起作用

爲什麼C工作,但不是B?沒有比C線更清潔的方式嗎? C線看起來很不吸引人。

+1

應該是'@IBOutlet弱VAR txtField:'的UITextField –

+0

@LeoDabus哈!謝謝。但看着「文本」屬性。爲什麼這是可選的?我的意思是爲什麼我Cmmd +單擊它它顯示'@屬性(非原子,只讀)NSString *文本;'它不顯示任何像'文本:字符串?'它是如何從Objective-C翻譯爲可選? – Honey

+0

我不是swift專家,所以我會留下一條評論而不是答案......'didEnterText'需要一個非零值,所以我的理解是,如果'txtField'沒有'.text '聲明的一部分甚至不會被評估,因此添加'.text!'不能解決無文本字段的問題。在選項C中,編譯器看到的所有值都是「保證」爲非零值,因爲整個事物被包裝在parens中... – Mike

回答

2

didEnterText不需要String?。它需要String。因此,你不能使用帶有問號的簡單可選鏈來獲得它的參數。您必須實際上解開爲String,而不是暫時解開爲String? - 或 - 無。

現在,txtField是一個可選的,所以你需要解開它。

而UITextField的text屬性是可選的,所以你也需要解開它。

所以最簡單的方法是解開他們兩個,絕對:

delegate!.didEnterText(txtField!.text!) 

如果你不希望這樣做(因爲你害怕他們中的一個將是零和崩潰的應用程序),你將保護整個事情與if let

if let s = txtField?.text { 
     delegate!.didEnterText(s) 
    } 
+0

所以基本上你說的非選擇性將永遠不會使用可選項,除非它通過'!',即不是'''保證? – Honey

+0

我不太清楚你的意思。一個簡單的事實是,你不能提供一個'String'來預期'String'。 'String'隱藏在'String?'裏面。你必須打開它!你可以用'!'不安全地拆開它,或者用'if let'安全地有條件地拆開它,但是在你使用它之前你必須拆開它。 – matt

+1

它幾乎看起來好像你不完全清楚什麼是可選_is_。如果是這樣的話,我的書會幫助你:http://www.apeth.com/swiftBook/ch03.html#_optional – matt

相關問題