2017-06-05 29 views
1

我在該陣列中有一個類型爲Any的陣列,它有兩種不同的類型,PersonSportsMan,它們都有一個名爲rank的值。我想根據等級對陣列進行排序。以下是我怎麼今天做它和它的作品:任何基於變量的濾波器陣列

self.persons.sort { 
    let a = ($0 as AnyObject) as? Person 
    let b = ($0 as AnyObject) as? SportsMan 
    let l = a?.rank ?? b?.rank 

    let c = ($1 as AnyObject) as? Person 
    let d = ($1 as AnyObject) as? SportsMan 
    let r = c?.rank ?? d?.rank 
    return l! < r! 
} 

I'm感覺有點不確定,因爲在l! < r!!的。這是解決這個問題的一個好方法,還是建立在此功能之上的?

+3

更好的辦法:讓'Person'和'SportsMan'有一個共同的基類/協議具有'rank'屬性。那麼不要使用'[Any]'而是'[YourBaseClass]'。 – luk2302

+1

你爲什麼通過'AnyObject'投射?如果'Person'和'SportsMan'具有共同的功能 - 使用協議(並且擁有該協議的陣列)。 – Hamish

+1

@ luk2302我會繼續說你所說的,一個協議肯定會起作用。 – gwinyai

回答

2

制定一個協議,如Rankable,並使PersonSportsMan符合它。

protocol Rankable { 
    var rank: Int { get } 
} 

然後讓你的陣列到[Rankable](又名Array<Rankable>),而不是[Any],並且像這樣排序是:

self.persons.sort{ $0.rank < $1.rank } 
+0

我應該在哪裏添加該協議,我懷疑我需要從Person和SportsMan中刪除排名屬性並使用Person:Rankable並使用該屬性內的排名替代或? –

+0

'Person'和'SportsMan'的現有'rank'屬性可以滿足協議的要求。你只需要爲'Person'和'SportsMan'聲明符合'Rankable' – Alexander