【问题标题】:Cannot call value of non-function type (declared as var)不能调用非函数类型的值(声明为var)
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 2016-11-26
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多