【问题标题】:Cannot call value of non-function type 'String'无法调用非函数类型“字符串”的值
【发布时间】:2016-05-04 13:06:03
【问题描述】:

我正在尝试将 ILTItem 变量传递到我的 ILTViewController,当用户通过深层链接启动我的应用程序时由 AppDelegate.swift 触发。

我有错误的代码:

不能调用非函数类型'String'的值

在我定义ilt的那一行。

这是我目前拥有的代码:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var ilt = ILT(homeworkID: 1234, title: "History ILT", subject: "History", teacher: "Miss A Smith", teacherCode: "asmith", studentID: 12345, description: "Description....", due: 1450137600, status: "In Progress", hasAttachments: true)
var newVC = ILTViewController()
newVC.ILTitem = ilt
appDelegate.window?.addSubview(newVC.view)

为什么会这样?在我的 ILTViewController 类中,我有:

class ILTViewController: UIViewController {
  // accept the incoming ILT struct
  var ILTitem: ILT!

IlT 结构声明:

struct ILT {
    let homeworkID: Int
    let title: String
    let subject: String
    let teacher: String
    let teacherCode: String
    let studentID: Int
    let description: String
    let due: Double
    let status: String
    let hasAttachments: Bool
}

【问题讨论】:

  • 发布你的ILT类声明
  • @redent84 我已经添加了
  • 您的代码运行良好:swiftstub.com/580271845。您可能在其他地方声明了一个名为 ILTString 变量,这就是它失败的原因。
  • @redent84 这不是问题,因为当我将它合并到newVC.ILTItem = ILT(homeworkID: 1234, title: "History ILT", subject: "History", teacher: "Miss A Smith", teacherCode: "asmith", studentID: 12345, description: "Description....", due: 1450137600, status: "In Progress", hasAttachments: true) 时,它仍然会失败并显示相同的消息。
  • 我的意思是你重新声明了ILT(大写),而不是ilt(小写)。该错误告诉您您正在尝试调用 String 而不是方法(在您的情况下为结构构造函数)。而且,您可以查看我提供的链接,错误在您的代码中的其他地方,因为您发布的代码可以正常工作。

标签: ios swift struct viewcontroller


【解决方案1】:

错误告诉您您正在尝试调用 String 而不是方法(在您的情况下为结构构造函数)。您可能已经在其他地方声明了一个名为 ILT(大写)的 String 变量,这就是它失败的原因。

您发布的代码works fine,因此错误必须在您的代码中的其他位置。

【讨论】:

  • 谢谢。与该问题相关但略有不同的问题 - 我的 ILTViewController: UIViewController 类没有收到新变量 - printing ILTItem.title 返回 null。知道为什么吗?
  • 我建议您使用相关代码打开一个新问题,最好是一个能够重现该问题的自包含示例项目。
  • 意外调用 KRProgressHUD.show()() 时发生在我身上(双括号意外)
【解决方案2】:

将你的 let 语句包装在 if 例如:

if let xxx = yyy {
   ... do something
}

【讨论】:

    【解决方案3】:

    作品:

    let works = ["foo", "bar"].first(where: { ($0 == "foo") } )
    let works = ["foo", "bar"].first(where: { (_ in true) } )
    

    失败:

    let fails = ["foo", "bar"].first(where: { (true) } )
    
    // Cannot call value of a non-function type 'String?'
    

    您必须确保在闭包表达式中使用参数$0_ in)。

    使用_ in$0 丢弃或引用参数。你不能简单地直接进入闭包体并返回true,否则你会收到这个(非常无用的)错误。

    【讨论】:

      【解决方案4】:

      在这段代码中有类似的问题

      array.first { $0 == item }
      

      问题在于$0 不符合Equatable 协议。在我的情况下,它符合NSObjectProtocol 并且简单的指针比较就足够了,所以我解决了这个问题

      array.first { $0 === item }
      

      【讨论】:

        【解决方案5】:

        所以我遇到了类似错误消息的问题。我正在编写一个结构来为我的库处理标量,并且需要一个平方根。 错误是

        不能调用非函数类型'Vsip.Scalar'的值

        当调用 sqrt.通过显式调用 sqrt 来修复它,如下所示。希望这会有所帮助。

        public var sqrt: Scalar {
                switch self.type {
                case .f:
                    return Scalar(sqrtf(self.realf))
                case .d:
                    let x = Foundation.sqrt(self.reald)
                    return Scalar(x)
                case .cf:
                    return Scalar(vsip_csqrt_f(self.vsip_cf))
                case .cd:
                    return Scalar(vsip_csqrt_d(self.vsip_cd))
                default:
                    precondition(false, "sqrt not supported for type \(self.type)")
                }
            }
        

        【讨论】:

          【解决方案6】:

          在弄乱 Swift 的各种闭包语法类型 + 自动完成时,我经常发现自己陷入了一堆变量、返回类型以及使用太少或太多的 (){}

          我最终得到了类似的东西:

          filenames.first(where: { $0 == filename } ) {
          
          }
          

          这是什么错误

          不能调用非函数类型的值

          解决方案是删除尾随的{ },这在此表单中是不正确的。

          应该只是filenames.first(where: { $0 == filename } )

          检查您没有错误地将一组大括号应用到您的非函数等的末尾,或者您当前选择的 Swift 闭包语法中的其他一些难以发现的错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-08-16
            • 2020-02-01
            • 2021-01-15
            • 2021-03-30
            • 2016-03-10
            • 2016-09-26
            • 2017-06-27
            相关资源
            最近更新 更多