不能调用非函数types的值'String'

我试图将ILTItemvariables传递到我的ILTViewController,当用户通过深层链接启动我的应用程序时,由AppDelegate.swift触发。

我有错误的代码:

不能调用非函数types的值'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 } 

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

您发布的代码工作正常,所以错误必须在您的代码中的其他地方。

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

VS

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

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

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

包装你的let语句,例如:

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

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

 array.first { $0 == item } 

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

 array.first { $0 === item } 

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

不能调用非函数types的值“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的各种闭包语法types+自动完成时,我经常发现自己陷入了一堆variables,返回types,以及使用太less或太多的(){}集合。

我结束了这样的事情:

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

这是给错误

不能调用非函数types的值

解决scheme是删除尾部{ } ,这在这种forms是不正确的。

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

检查你没有错误地将一组大括号应用到非函数等的末尾,或者在你当前select的Swift闭包语法中很难find错误。