2017-09-06 119 views
1

我無法弄清楚什麼是錯的以下內容:這個Swift語法有什麼問題?

fileprivate func showInlineErrorMessage(_ message: String, forField textField: UITextField) { 

     // Show error message 
     errorLabel.text = message 
     errorLabel.isHidden = false 

     // Highlight field on which the error is 
     [usernameTextField, passwordTextField, birthYearTextField, genderTextField].forEach { 
      updateHighlightOnTextField($0!, highlight: $0 === textField) 
     } 
    } 

的特定部分是$0 === textField

編譯器顯示以下錯誤:

"?" must be followed by a call, member lookup, or a subscript 

這是舊代碼,所以最近似乎有些事情可能發生了變化。

被調用的功能

fileprivate func updateHighlightOnTextField(_ textField: UITextField, highlight: Bool) { 
     let highlightView = textField.superview! 
     highlightView.layer.borderWidth = highlight ? 1.0 : 0.0 
     highlightView.layer.borderColor = highlight ? DefaultTheme.lineColorError.cgColor : nil 
    } 

enter image description here

+2

'updateHighlightOnTextField'方法的簽名是什麼?爲什麼你強制展開'$ 0'作爲第一個參數?是否有一個或多個文本字段是可選的?如果第一個參數是force-unwrapped,爲什麼不是第二個? – rmaddy

+0

我剛剛更新了上面的問題與其他信息。 –

回答

1

迅速有時候無法理解內嵌語句的類型。 您是否嘗試過:

創建外部布爾:

[usernameTextField, passwordTextField, birthYearTextField, genderTextField].forEach { 
     let isHighlighted: Bool = ($0 === textField) 
     updateHighlightOnTextField($0!, highlight: isHighlighted) 
    } 
+0

謝謝,這是我可以上班的唯一途徑。 –

1

不必要的使用武力,解包似乎會造成問題。

如果更改:

updateHighlightOnTextField($0!, highlight: $0 === textField) 

到:

updateHighlightOnTextField($0, highlight: $0 === textField) 

然後問題消失。

這確實假定您的文本字段屬性被聲明爲非可選或隱含解包選項。

如果您的文本字段被聲明爲可選項,那麼您可以安全地解開$0以避免使用!

+0

這沒有什麼區別,包裝或解包出現相同的問題 –

+0

您使用的是哪個版本的Xcode?我的回答是基於斯威夫特遊樂場的實際測試。消除'!'確實解決了這個問題。 – rmaddy

+0

Xcode版本8.3.3。 Xcode也堅持用$!解開$ 0,因爲這些是可選項 –