Метод Swift 2.0 не может быть помечен как @objc, потому что тип параметра не может быть представлен в Objective-C

После обновления 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
}

Ответы

Ответ 1

Вы очень хорошо объяснили проблему самостоятельно:

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 декларацию @objc func законной. (NSObject - Hashable, поэтому объем работы, необходимый для адаптации, может быть не очень большим.)

Ответ 2

Я получал это, потому что я объявил класс Notification of my own, и он возился с классом Notification Foundation.

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

Поэтому я изменил его на Foundation.Notification

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

Ответ 3

С этой меньшей информацией я могу только попытаться предложить вам поставить это перед объявлением Person.

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