我尝试将ILTItem变量传递到我的ILTViewController中,当用户通过深层链接启动我的应用时,由AppDelegate.swift触发。
我遇到错误的代码:
无法调用非功能类型的值'字符串'
在我定义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
}
答案 0 :(得分:20)
错误告诉您正在尝试调用String
而不是方法(在您的情况下为结构构造函数)。您可能在其他地方声明了一个名为String
(大写)的ILT
变量,这就是它失败的原因。
您发布的代码works fine因此错误必须位于代码中的其他位置。
答案 1 :(得分: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
,否则你将收到这个(非常无用的)错误。
答案 2 :(得分:2)
此代码中存在类似问题
array.first { $0 == item }
问题是$0
不符合Equatable
协议。在我的情况下,它符合NSObjectProtocol
并且简单的指针比较就足够了,所以我用
array.first { $0 === item }
答案 3 :(得分:1)
如果例如:
,请将let语句换行if let xxx = yyy {
... do something
}
答案 4 :(得分:1)
所以我遇到类似错误消息的问题。我正在为我的库编写一个处理Scalars的结构,需要一个平方根。 错误是
无法调用非函数类型'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)")
}
}
答案 5 :(得分:1)
在搞乱Swift的各种闭包语法类型+自动完成时,我常常发现自己陷入了一堆变量,返回类型,并使用了太少或太多的()
或{}
我最终得到了类似的东西:
filenames.first(where: { $0 == filename } ) {
}
哪个是错误
无法调用非功能类型的值
解决方法是删除尾随{ }
,这在此表单中不正确。
应该是filenames.first(where: { $0 == filename } )
检查您是否未正确地将一组大括号应用到非函数等的末尾,或者在您当前选择的Swift闭包语法中发现其他一些难以发现的错误。