2016-07-26 15 views
0

因此,从斯威夫特的文档,我才知道:如何在集合在swift中存储用户定义的类型时以特定顺序迭代集合的值?

斯威夫特的设置类型没有定义排序。要按特定顺序遍历集合中的 值,请使用sort()方法,该方法将该集合的元素作为使用运算符分类的数组返回该数组。

我可以理解如何在迭代时对基元数据类型进行排序,但是有什么方法可以使用户定义类型成为可能吗?假设我有一个叫做Foo的类,它符合可排序协议(我不确定它是否应该是一个要求)。假设Foo有两个属性,ID用户名

它可行吗?如果是,我该如何使它工作?

+1

使您的课程符合“Comparable”协议。 – dan

回答

1

因此,假设你Foo是这样的: (斯威夫特2码)

class Foo: Hashable, CustomStringConvertible { // Hashable is mandatory to be a Swift Set element. 
    var id: Int 
    var username: String 

    init(id: Int, username: String) { 
     self.id = id 
     self.username = username 
    } 

    //To conform to `Hashable` 
    var hashValue: Int { 
     return id.hashValue &+ username.hashValue 
    } 

    //useful for debugging 
    var description: String { 
     return "id: \(id), username: \(username)" 
    } 
} 
//Also, to conform to `Hashable` 
func == (lhs: Foo, rhs: Foo) -> Bool { 
    return lhs.id == rhs.id && lhs.username == rhs.username 
} 

做一个样品Set

let mySet: Set<Foo> = [ 
    Foo(id: 1, username: "Man"), 
    Foo(id: 2, username: "Seven"), 
    Foo(id: 3, username: "Jack"), 
    Foo(id: 4, username: "Ace"), 
    Foo(id: 5, username: "Taro"), 
] 

迭代通过id排序:

for f in mySet.sort({$0.id < $1.id}) { 
    print(f) 
} 

输出:

id: 1, username: Man 
id: 2, username: Seven 
id: 3, username: Jack 
id: 4, username: Ace 
id: 5, username: Taro 

迭代的排序条件为username

for f in mySet.sort({$0.username < $1.username}) { 
    print(f) 
} 

输出:

id: 4, username: Ace 
id: 3, username: Jack 
id: 1, username: Man 
id: 2, username: Seven 
id: 5, username: Taro 

您可以编写类似的代码与其他任何Comparable性能。 你可以找到很多有关排序Array s的文章,Set s可以按几乎相同的方式排序。

相关问题