【发布时间】:2017-03-02 20:19:37
【问题描述】:
我将我的项目迁移到 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 抱怨,那将是一个奖励!
【问题讨论】:
-
onSubmit是一个变量,它持有一个 closure 作为隐式展开的可选项。但是错误信息具有误导性,实际原因是字符串不再自动桥接到AnyObject。 – 在这些闭包定义中将AnyObject替换为Any可能会解决问题。 -
太棒了!那成功了。谢谢。我要花很长时间才能弄清楚这一点。
标签: ios swift migration tuples swift3