如何创建一组自定义对象(Swift)?

时间:2015-09-06 16:42:24

标签: ios swift set equatable

对于我的iOS应用程序,我有一个类似

的模型
class Person {
    var Id: Int
    var Name: String

    init(id: Int, name: String?) {
        self.Id = id
        self.Name = name ?? ""
    }
}

然后在我的ViewController中,当我从服务器加载数据时,我将一些人添加到数组中

class ViewController: UIViewController {
    var people:[Person] = []

    override func viewDidLoad() {
        self.loadPeople()
    }

    func loadPeople() {
        // This data will be coming from a server request
        // so is just sample. It could have users which 
        // already exist in the people array

        self.people.append(Person(id: "1", name: "Josh"))
        self.people.append(Person(id: "2", name: "Ben"))
        self.people.append(Person(id: "3", name: "Adam"))
    }
}

我现在尝试做的是将people数组转换为Set<Person>,因此不会添加重复项。这是可能做的还是我需要改变我的逻辑?

2 个答案:

答案 0 :(得分:55)

要设置Person集合,您需要使其符合Equatable和Hashable协议:

class Person: Equatable, Hashable {
    var Id: Int
    var Name: String

    init(id: Int, name: String?) {
        self.Id = id
        self.Name = name ?? ""
    }

    var hashValue: Int {
        get {
            return Id.hashValue << 15 + Name.hashValue
        }
    }
}

func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.Id == rhs.Id && lhs.Name == rhs.Name
}

然后你可以像这样使用一组人:

var set = Set<Person>()
set.insert(Person(id: 1, name: "name"))

答案 1 :(得分:7)

使用Swift 2.0,Hashable和Equitable是NSObject的一部分。您需要做的就是为感兴趣的属性覆盖“isEqual”和“var hash:”。在这种情况下:“Id”,Set将排除具有相同ID的Person对象。

<asp:TemplateField HeaderText="Receta">
    <ItemTemplate>
        <asp:Image ID="Receta1" runat="server" ImageUrl='<%# "Handler1.ashx?PacientId=" + Eval("PacientId") %>' Height="200px" Width="200px"
    </ItemTemplate>
</asp:TemplateField>