我将我的项目迁移到Swift 3,并在开源框架中减少了4个错误。开源代码是https://github.com/blackmirror-media/BMInputBox。它在Swift 2.2中运行良好。它迁移得相当顺利,但这些错误除外。错误都是相同的并且说明:
.../Pod/Classes/BMInputBox.swift:430:26:
Cannot call value of non-function type '((AnyObject...) -> Void)!'
以下是与之相关的代码:
/// Closure executed when user submits the values.
open var onSubmit: ((_ value: AnyObject...) -> Void)!
/// As tuples are not supported in Objc, this is a method, which is called as well, but instead an array of values are returned
open var onSubmitObjc: ((_ value: [AnyObject]) -> Void)!
/// Closure executed when user cancels submission
open var onCancel: (() -> Void)!
/// Closure executed when the value changes in the field. The caller can modify the value and return it
open var onChange: ((_ value: String) -> String)?
func cancelButtonTapped () {
if self.onCancel != nil {
self.onCancel()
}
self.hide()
}
func submitButtonTapped () {
// Submitting the form if valid
if self.validateInput() {
if self.onSubmit != nil {
let valueToReturn: String? = self.textInput!.text
if let value2ToReturn = self.secureInput?.text {
*Error> self.onSubmit(valueToReturn, value2ToReturn)
}
else {
*Error> self.onSubmit(valueToReturn)
}
}
if self.onSubmitObjc != nil {
let valueToReturn: String? = self.textInput!.text
if let value2ToReturn = self.secureInput?.text {
*Error> self.onSubmitObjc([valueToReturn!, value2ToReturn])
}
else {
*Error> self.onSubmitObjc([valueToReturn!])
}
}
self.hide()
}
// Shaking the validation label if not valid
else {
self.animateLabel()
}
}
我是Swift的新手,我很难搞清楚这实际应该做些什么。不知道这一点,很难弄清楚Swift 3不喜欢它。
这条线实际上做了什么?
open var onSubmit: ((_ value: AnyObject...) -> Void)!
对于我没有经验的人来说,看起来它正在尝试将一个元组传递给一个被声明为变量(而不是函数)并且不执行任何操作或返回任何内容的函数。我显然错过了一些东西。任何人都可以解释为什么它被声明为变量以及为什么没有定义逻辑?如果有人知道为什么Swift 3会抱怨,那将是一个奖励!
答案 0 :(得分:1)
onSubmit
是一个变量,它将闭包作为隐式展开的可选项。但错误消息具有误导性,实际原因是字符串(数字等)不再自动桥接到Swift 3中的AnyObject
。
在这些闭包定义中用AnyObject
替换Any
(所有类型符合的协议)应该可以解决问题。