无法调用非函数类型的值 '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 }
我正在尝试将 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 }