无法调用非函数类型的值(声明为var)

时间:2016-10-20 17:42:48

标签: ios swift migration tuples swift3

我将我的项目迁移到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会抱怨,那将是一个奖励!

1 个答案:

答案 0 :(得分:1)

onSubmit是一个变量,它将闭包作为隐式展开的可选项。但错误消息具有误导性,实际原因是字符串(数字等)不再自动桥接到Swift 3中的AnyObject

在这些闭包定义中用AnyObject替换Any所有类型符合的协议)应该可以解决问题。