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

时间:2016-05-16 14:24:42

标签: swift

在我将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
}

3 个答案:

答案 0 :(得分:30)

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

class Person: Hashable {

人不是NSObject。但Objective-C只能看到NSObject派生的类类型。因此,您的Person类型对Objective-C是不可见的。但是你的@objc func声明用于一个带有Person数组的函数 - 我们刚才说Person对Objective-C是不可见的。所以你的@objc func声明是非法的。 Objective-C无法显示此功能,因为它无法显示其参数。

您需要将类声明更改为如下所示:

class Person: NSObject {

......然后你当然可以在课堂实施中做出任何必要的进一步调整。但这种变化会使您的@objc func声明合法化。 (NSObject Hashable,因此进行此调整所需的工作量可能不是很大。)

答案 1 :(得分:2)

我得到了这个,因为我宣布了我自己的一个Notification课,而且它正在弄乱基金会的通知课。

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

所以我把它改成了Foundation.Notification

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

答案 2 :(得分:0)

有了这些较少的信息,我只能建议你在Person声明之前提出这个。

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