无法调用非函数类型的值'字符串'

时间:2016-01-27 14:15:34

标签: ios swift struct viewcontroller

我尝试将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
}

6 个答案:

答案 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闭包语法中发现其他一些难以发现的错误。