Метод 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 {
...
}