2017-06-05 8 views
1

この配列にはAnyの配列があり、PersonSportsManの2種類の配列があり、両方ともrankという値があります。ランクに基づいて配列を並べ替える必要があります。ここでは、私は今日それを行っているし、それがどのように動作するかです:変数の基になるAnyのフィルタ配列

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! 
} 

- 私が原因l! < r!!のビットがわからない感じ。これを解決するには良い方法ですか、それともこれを使うために組み込み関数ですか?

+3

良い方法: 'Person'と' SportsMan'は、共通の基本クラスを持たせます/プロトコルには 'rank'プロパティがあります。そして '[Any]'ではなく '[YourBaseClass]'を使います。 – luk2302

+1

なぜAnyObject経由でキャストしていますか? 'Person'と' SportsMan'が共通の機能を持っているなら、プロトコルを使います(そしてそのプロトコルの配列を持っています)。 – Hamish

+1

@ luk2302私はあなたが言ったことを続けるでしょう、プロトコルは確かにうまくいくでしょう。 – gwinyai

答えて

2

Rankableなどのプロトコルを作成し、PersonおよびSportsManに準拠させてください。その後

protocol Rankable { 
    var rank: Int { get } 
} 

むしろ[Any]より[Rankable](別名Array<Rankable>)にあなたの配列を作る、などのようにそれを並べ替える:

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

このプロトコルを追加する必要があります。私は、PersonとSportsManからランクプロパティを削除し、Person:Rankableを使用して、代わりにそのプロパティ内のランクを使用する必要があると考えていますか? –

+0

'Person'と' SportsMan'の既存の 'rank'プロパティは、プロトコルの要件を満たすことができます。 'Person'と' SportsMan'の両方のために 'Rankable'への準拠を宣言するだけです – Alexander

関連する問題