Swift3 Swift |与NSObject一起设置

Swift3 Swift |与NSObject一起设置,swift3,set,hashable,equatable,Swift3,Set,Hashable,Equatable,我正在尝试创建一个带有自定义对象的集合。 这是可行的,如果我使用一组自定义对象,则没有重复项: public class AttributesGroup: Hashable, Equatable, Comparable { open var id: Int! open var name: String! open var position: Int! public init (id: Int = 0, name: String = "", position:

我正在尝试创建一个带有自定义对象的集合。 这是可行的,如果我使用一组自定义对象,则没有重复项:

public class AttributesGroup: Hashable, Equatable, Comparable {

    open var id: Int!
    open var name: String!
    open var position: Int!

    public init (id: Int = 0, name: String = "", position: Int = 0) {
        self.id = id
        self.name = name
        self.position = position
    }

    open var hashValue: Int {
        get {
            return id.hashValue
        }
    }

    public static func ==(lhs: AttributesGroup, rhs: AttributesGroup) -> Bool {
        return lhs.id == rhs.id
    }

    public static func < (lhs: AttributesGroup, rhs:AttributesGroup) -> Bool {
        return lhs.position < rhs.position
    }
}
公共类属性组:可散列、可等额、可比较{
打开变量id:Int!
打开变量名称:String!
打开变量位置:Int!
public init(id:Int=0,name:String=”“,position:Int=0){
self.id=id
self.name=名称
self.position=位置
}
打开变量hashValue:Int{
得到{
返回id.hashValue
}
}
公共静态函数==(lhs:AttributesGroup,rhs:AttributesGroup)->Bool{
返回lhs.id==rhs.id
}
公共静态函数<(左:属性组,右:属性组)->Bool{
返回左侧位置<右侧位置
}
}
我用NSObject扩展了我的类,因为NSObject已经实现了Hashable协议(也可以是Equatable),我必须重写hashValue,这不再起作用了,如果我使用一组自定义对象,有重复的,我在这里做错了什么

public class AttributesGroup: NSObject, Comparable {

    open var id: Int!
    open var name: String!
    open var position: Int!

    public init (id: Int = 0, name: String = "", position: Int = 0) {
        self.id = id
        self.name = name
        self.position = position
    }

    open override var hashValue: Int {
        get {
            return id.hashValue
        }
    }

    public static func ==(lhs: AttributesGroup, rhs: AttributesGroup) -> Bool {
        return lhs.id == rhs.id
    }

    public static func < (lhs: AttributesGroup, rhs:AttributesGroup) -> Bool {
        return lhs.position < rhs.position
    }
}
公共类属性组:NSObject,可比较{
打开变量id:Int!
打开变量名称:String!
打开变量位置:Int!
public init(id:Int=0,name:String=”“,position:Int=0){
self.id=id
self.name=名称
self.position=位置
}
打开覆盖变量hashValue:Int{
得到{
返回id.hashValue
}
}
公共静态函数==(lhs:AttributesGroup,rhs:AttributesGroup)->Bool{
返回lhs.id==rhs.id
}
公共静态函数<(左:属性组,右:属性组)->Bool{
返回左侧位置<右侧位置
}
}

谢谢你的帮助

NSObject是Cocoa类型。NSObject的规则与Swift的规则不同。要使NSObject在一个集合中工作,它必须有一个
isEqual
的实现与其
hash
的实现一致NSObject是Cocoa类型。NSObject的规则与Swift的规则不同。要使NSObject在一个集合中工作,它必须有一个
isEqual
的实现与它的
hash

的实现相一致。事实上,这是与isEqual和hash的实现一起工作的。谢天谢地,这正与isEqual和hash的实现一起工作。谢天谢地,永远不要将属性声明为隐式未包装的选项,这些选项在
init
方法中使用非可选值初始化。不幸的是,许多可怕的教程都暗示了这种可怕的习惯。不要那样做,永远不要。去掉感叹号。比较的第2点和@vadian你完全正确,这是一个坏习惯。谢谢。@Hamish非常有趣,我现在明白了,谢谢,因为总是,从来没有将属性声明为隐式未包装的选项,这些选项在
init
方法中使用非可选值初始化。不幸的是,许多可怕的教程都暗示了这种可怕的习惯。不要那样做,永远不要。去掉感叹号。比较的第2点和@vadian你完全正确,这是一个坏习惯。谢谢。@Hamish很有趣,我现在明白了,谢谢