不能调用非函数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
(大写字母)的String
variables,这就是为什么它失败了。
您发布的代码工作正常,所以错误必须在您的代码中的其他地方。
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错误。