ios 无法调用非函数类型“String”的值

5tmbdcev  于 2023-01-27  发布在  iOS
关注(0)|答案(7)|浏览(248)

我尝试将ILTITem变量传递到我的ILTViewController中,当用户通过deeplink启动我的应用时,由AppDelegate.swift触发。
我有错误的代码:
无法调用非函数类型"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 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
}
v9tzhpje

v9tzhpje1#

这个错误告诉你你正在尝试调用一个String而不是一个方法(在你的例子中是结构构造函数)。你可能在其他地方声明了一个名为ILT(大写)的String变量,这就是失败的原因。
您发布的代码works fine,所以错误一定是在代码中的其他地方。

l0oc07j2

l0oc07j22#

把你的let语句括起来,如:

if let xxx = yyy {
   ... do something
}
imzjd6km

imzjd6km3#

作品:

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,否则您将收到此错误(非常无益)。

2hh7jdfx

2hh7jdfx4#

此代码中存在类似问题

array.first { $0 == item }

问题是$0不符合Equatable协议。在我的情况下,它符合NSObjectProtocol,简单的指针比较就足够了,所以我用以下命令修复了这个问题

array.first { $0 === item }
kmpatx3s

kmpatx3s5#

所以我遇到了一个类似的错误消息。我正在为我的库编写一个处理标量的结构,需要一个平方根。错误是
无法调用非函数类型“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)")
        }
    }
h4cxqtbf

h4cxqtbf6#

在使用Swift的各种闭包语法类型+ autocomplete时,我经常发现自己陷入了变量、返回类型的混乱,并且使用了太少或太多的(){}集合
我最后得到了这样的结果:

filenames.first(where: { $0 == filename } ) {

}

它给出了错误
不能调用非函数类型的值
解决方案是删除尾随的{ },这在此表单中是不正确的。
应该是filenames.first(where: { $0 == filename } )
检查一下你没有在non-function的末尾错误地使用一组大括号,或者在你当前选择的Swift闭包语法中有其他一些难以发现的错误。

tnkciper

tnkciper7#

检查您是否错过了可选选项的**?**。
在重载模式中,这个错误可能会显示为不同的问题,比如当我忘记标记可选时。
services.first(where: { $0.category?.id == categoryID })

相关问题