2016-07-26 14 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可以按幾乎相同的方式排序。

相關問題