Cannot call value of non-function type 'String'
Solution 1
The error is telling you that you are trying to call a String
instead of a method (struct constructor in your case). You've probably declared a String
variable named ILT
(uppercase) somewhere else and that's why it fails.
Your posted code works fine so the error must be somewhere else in your code.
Solution 2
Wrap your let statement in if eg:
if let xxx = yyy {
... do something
}
Solution 3
Works:
let works = ["foo", "bar"].first(where: { ($0 == "foo") } )
let works = ["foo", "bar"].first(where: { (_ in true) } )
Fails:
let fails = ["foo", "bar"].first(where: { (true) } )
// Cannot call value of a non-function type 'String?'
You must be sure to use the parameter ($0
or _ in
) in the closure expression.
Use _ in
or $0
to discard or reference the parameter. You cannot simple move directly into the closure body and return true
or you will receive this (extremely unhelpful) error.
Solution 4
Had a similar issue in this code
array.first { $0 == item }
The problem was with $0
not conforming to Equatable
protocol. In my case it conformed to NSObjectProtocol
and simple pointer comparison was enough, so I fixed the issue with
array.first { $0 === item }
Solution 5
So I had a problem with a similar error message. I am writing a structure to handle Scalars for my library and needed a square root. Error was
Cannot call value of non-function type 'Vsip.Scalar'
when calling sqrt. Fixed it by explicitly calling sqrt as shown below. Hope this helps.
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)")
}
}
James
Updated on July 09, 2022Comments
-
James almost 2 years
I'm trying to pass the ILTItem variable into my ILTViewController, triggered by AppDelegate.swift when the user launches my app via a deeplink.
The code I have errors with:
Cannot call value of non-function type 'String'
on the line where I define
ilt
.Here's the code I have at the moment:
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)
Why could this be? In my ILTViewController class I have:
class ILTViewController: UIViewController { // accept the incoming ILT struct var ILTitem: ILT!
IlT Struct Declaration:
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 }