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

这类人:

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
}

推荐答案

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

class Person: Hashable {

Person不是对象.但是Objective-C只能看到NSObject派生的类类型.因此,你的Person类型对Objective-C是不可见的.但是你的@objc func声明是针对一个包含Person数组的函数的——我们刚才说过,Person对Objective-C是不可见的.所以你的@objc func声明是非法的.Objective-C无法显示此函数,因为无法显示其参数.

您需要更改您的类声明以如下方式开始:

class Person: NSObject {

...然后,您当然可能需要对类的实现进行任何必要的进一步调整.但这一改变将使你的@objc func元申报合法化.(NSObject is是可哈希的,因此进行这种调整所需的工作量可能不是很大.)

Swift相关问答推荐

WWDC Swift并发会话中的厨房服务示例令人困惑

数据不会被ARC删除在swift'

如何使用快速宏用来自函数的关联值来初始化枚举?

在解码字符串时需要帮助.

在MacOS上检测键盘是否有Globe键

如何强制创建新的UIViewControllerRenatable|更新Make UIViewController上的视图

在不传递参数的情况下使用Init方法?

如何获取嵌套数组中项的路径以修改数组?

在SwiftUI中,我如何确保带有符号的单词不会被拆分为两行?

我需要一些关于 SwiftUI 动画的帮助

macOS SwiftUI: 如何触发删除一个项目?

根据其属性组合 2 个模型以在 Swift 中创建另一个模型

当变量首次用于其自己的初始化时,如何清除变量...在初始化之前使用错误?

故事板未在助手中显示视图控制器

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

如何在 SwiftUI 中打开 ImagePicker?

Swift 中的 PageViewController 当前页面索引

Swift 3:日期与 NSDate?

在 unwind segue 之后执行 push segue

键盘显示时Tableview滚动内容