一尘不染

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

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
}

阅读 198

收藏
2020-07-07

共1个答案

一尘不染

您已经很好地解释了问题所在:

class Person: Hashable {

人不是NSObject。但是Objective-C只能看到NSObject派生的类类型。因此,您的Person类型对Objective-
C不可见。但是您的@objc func声明是针对需要一个Person数组的函数的-我们刚刚说过,Person-
C不可见Person。因此,您的@objc func声明是非法的。无法向Objective-C显示此功能,因为无法向其显示其参数。

您需要更改您的类声明才能像这样开始:

class Person: NSObject {

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

2020-07-07