2017-09-06 120 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,因为这些是可选项 –