无法调用非函数类型的值 'String'

Cannot call value of non-function type 'String'

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

我的代码有错误:

Cannot call value of non-function type '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 我有:

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
}

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

您发布的代码 works fine 所以错误一定是在您代码的其他地方。

将 let 语句包装在 if 中,例如:

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

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

Cannot call value of non-function type '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)")
        }
    }

在摆弄 Swift 的各种闭包语法类型 + 自动完成时,我经常发现自己处于混乱的变量、return 类型中,并且使用的 [= 集太少或太多11=] 或 {}

我最终得到了这样的结果:

filenames.first(where: { [=10=] == filename } ) {

}

出现错误的地方

Cannot call value of non-function type

解决方案是删除结尾的 { },这在这种形式中是不正确的。

应该只是 filenames.first(where: { [=14=] == filename } )

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

作品:

let works = ["foo", "bar"].first(where: { ([=10=] == "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?'

您必须确保在闭包表达式中使用参数[=12=]_ in)。

使用_ in[=12=]丢弃或引用参数。你不能简单地直接移动到闭包体和 return true 否则你会收到这个(非常无用的)错误。

在此代码中有类似的问题

array.first { [=10=] == item }

问题出在 [=12=] 不符合 Equatable 协议。在我的例子中,它符合 NSObjectProtocol 并且简单的指针比较就足够了,所以我用

解决了这个问题
array.first { [=11=] === item }