在我将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
}
答案 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 {
...
}