Cannot call value of non-function type 'String'

80,410

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)")
        }
    }
Share:
80,410
James
Author by

James

Updated on July 09, 2022

Comments

  • James
    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
    }