2017-10-31 9 views
1

イムダブルプロパティの値によって、カスタムオブジェクトの配列には、私は市場という名前のカスタムクラスを持っていると、このクラスには、いくつかのプロパティが含まれている、ソート迅速にObjective-Cのから私の自己を移動しようとスウィフト4

class Market { 
    var name = String? 
    var volume = Double? 
} 

それらの多くはArrayに格納されていて、このArrayをvolumeプロパティで昇順または降順にソートしようとしています。

私はこれを試しましたが動作しません。バイナリ演算子 '>'は2つの 'Double?'に適用できません。オペランド

self.market.sort(by:{$0.volume > $1.volume}) 

これを行うには最も便利な方法は何ですか?

+0

なぜプロパティはオプションですか?あなたは実際に名前のない、またはボリュームのないマーケットを持つことができますか? – rmaddy

+0

私はjsonから値を取得する可能性がありますが、いくつかのプロパティにapiがnilを返す可能性がありますが、まずオプションのバインディングを使用してループを行い、ボリュームとマーケット名を持つすべてのオブジェクトを取得してから新しい配列を並べ替えて –

答えて

1

あなたは(==を使用したことを除いて)直接2つの値を比較することはできませんオプションです。したがって、欠落しているボリューム値と、別の欠損ボリューム値または有効なボリューム値とを比較することが何を意味するのかを判断する必要があります。

単純なままにしたい場合は、不足している音量値をゼロとして扱うことができます。次に、あなたのコードは次のようになります。

self.market.sort { ($0.volume ?? 0) > ($1.volume ?? 0) } 

最後に、より複雑なバージョンでしょう常にソートnilのボリューム値:

self.market.sort { 
    if let v1 = $0.volume { 
     if let v2 = $1.volume { 
      // Both values exist 
      return v1 > v2 
     } else { 
      // there is no v2 - treat v1 as < v2 
      return false 
     } 
    } else { 
     if let v2 = $1.volume { 
      // there is no v1 - treat v2 as < v1 
      return true 
     } else { 
      // both are nil 
      return true 
     } 
    } 
} 

$0.volumeは関係なく、$1.volumeの値のnilある場合trueがいることを、返されますので、次のように減らすことができます:

self.market.sort { 
    if let v1 = $0.volume { 
     if let v2 = $1.volume { 
      // Both values exist 
      return v1 > v2 
     } else { 
      // there is no v2 - treat v1 as < v2 
      return false 
     } 
    } else { 
     return true 
    } 
} 

もう一つの選択肢は、 2つのプロパティはオプションです。 JSONデータを解析する際に、どちらかの値が不足している場合は、有効でないと主張できるので、単にその市場をスキップしてください。

+0

はい、ありがとう、働いて、私はjson応答を取得した後、最初にすべてのnilオブジェクトの値を削除します –

+0

"最初にすべてのゼロ値をクリアする"ということはどういう意味ですか? – rmaddy

+0

私は私のコメントを編集した申し訳ありませんが、私はこれらの2つのプロパティのnilを持つ配列からすべてのオブジェクトを削除するので、nilの値を気にする必要はありませんので、jsonには多くのプロパティがあります。 –

1

可能な方法の1つです。

??オペレータを使用してください。ただし、volumeの確認が必要です。

self.market.sorted(by: {$0.volume ?? 0.0 > $1.volume ?? 0.0}) 

または、classプロパティにデフォルト値を使用します。 volume以来

var volume: Double? = 0.0 
+0

素晴らしい、それは、感謝を働いた! –

関連する問題