【问题标题】:Swift 2.0 Method cannot be marked @objc because the type of the parameter cannot be represented in Objective-CSwift 2.0 方法不能被标记为@objc,因为参数的类型不能在 Objective-C 中表示
【发布时间】:2016-09-12 09:08:59
【问题描述】:

在我将 Swift 1 更新到 Swift 2.0 之后,我遇到了一个问题。

我在此代码的第一行收到以下错误:

无法将方法标记为@objc,因为在Objective-C中无法表示参数的类型

@objc func personsToFirstStep(persons: [Person]) {
    for person in persons {
        if !self.persons.contains(person) && person.id != userID {
            self.persons.append(person)
        }
    }

    collectionView.reloadData()
    collectionViewPlaceholder.hidden = true
    collectionView.hidden = false
    collectionGradientView.hidden = false
} 

这个这个Person类:

class Person: Hashable {

    var intID: Int = 0
    var id: String = ""
    var name: String = ""
    var type: String = ""

    var hashValue: Int {
        return self.intID
    }

    init(id: String, name: String, type: String) {
        self.id = id
        self.intID = Int(id)!
        self.name = name
        self.type = type
    }

}

func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.intID == rhs.intID
}

【问题讨论】:

  • Person可以继承NSObject吗?
  • Person 是什么?也请edit your question 提供您的代码,而不是将其作为评论或屏幕截图发布。屏幕截图有助于显示问题所在,但绝不应替代实际代码——因为外部链接可能会中断,其他人无法轻松使用它。
  • 人是一类)
  • Person 必须继承自 NSObject!

标签: swift


【解决方案1】:

我得到这个是因为我声明了我自己的一个类 Notification,它与 Foundation 的 Notification 类混淆了。

@objc func playerItemDidReachEnd(notification: Notification) {...}

所以我把它改成了 Foundation.Notification

@objc func playerItemDidReachEnd(notification: Foundation.Notification) {...}

【讨论】:

  • 跟我遇到的问题一模一样。
  • 上帝保佑你,我不会知道这个问题,因为误导性的编译器错误不够聪明,无法知道我创建了一个与框架类冲突的通知类。
【解决方案2】:

你自己很好地解释了这个问题:

class Person: Hashable {

Person 不是 NSObject。但是Objective-C只能看到NSObject派生的类类型。因此,您的 Person 类型对 Objective-C 是不可见的。但是您的 @objc func 声明是针对一个接受 Person 数组的函数的——我们刚刚说过 Person 对 Objective-C 是不可见的。所以你的@objc func 声明是非法的。 Objective-C 不能显示这个函数,因为它不能显示它的参数。

你需要改变你的类声明,这样开始:

class Person: NSObject {

...然后您当然可能必须在类的实现中进行任何必要的进一步调整。但是这种更改将使您的@objc func 声明合法。 (NSObject 可散列的,因此进行这种适配所需的工作量可能不是很大。)

【讨论】:

  • 但是我应该如何处理 var hashValue: Int { return self.intID } Just delete?
  • 是的,但是你仍然需要决定你希望哈希性/平等性如何为这个类工作。他们需要一起工作。如果你不说你想要发生的事情,Cocoa 将退回到对象身份,这似乎不是你想要的。你需要按照 Cocoa 期望的方式来做这件事。这就是我在回答中“进一步调整”的意思。 — 参见例如stackoverflow.com/a/33320737/341994
【解决方案3】:

由于信息较少,我只能尝试建议您将其放在Person 声明之前。

@objc(Person)
class Person {
...
}

【讨论】:

  • 我们可以在调用类时使用@objc...但是:NSObject 帮助很大...)
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多