2017-10-27 12 views
3

StackOverflowの最初の質問...優しくしてください。 :)Swiftで関連付けられた値を持つ列挙型の配列をソートするにはどうすればよいですか?

私は年代順にソートしたい関連する値を持つ列挙型の配列を持っています。これらの値の1つには、表示されるソートに使用する日付(String)が含まれています。ここで

は、それが現時点では次のようになります。

enum cellType { 
    case standard(text: String, icon: UIImage, hasChildren: Bool, reference: String) 
    case detailed(text: String, secondaryText: String, icon: UIImage, hasChildren: Bool, reference: String) 

    var identifier: String { 
     switch self { 
     case .standard: return "standardCell" 
     case .detailed: return "detailedCell" 
     } 
    } 
} 

var cellData: [cellType] 

その後cellDataは、いくつかのcellTypeのが移入されます。 secondaryTextの値は、日付が含まれており、それは次のようになります。私は次のことが明らかにあまりにも簡単だった、配列をソートしようとしたとき

print(cellData) 

// [ 
// AppIdentifier.cellType.detailed(text: "Title A", secondaryText: "2017-10-20T10:04:00.000+02:00", icon: <UIImage: 0x60c0002a6660>, {12, 21}, hasChildren: false, reference: "40693"), 
// AppIdentifier.cellType.detailed(text: "Title B", secondaryText: "2016-12-14T10:04:00.000+02:00", icon: <UIImage: 0x60c0002a6660>, {12, 21}, hasChildren: false, reference: "40632") 
// AppIdentifier.cellType.detailed(text: "Title C", secondaryText: "2017-10-20T10:07:00.000+02:00", icon: <UIImage: 0x60c0002a6660>, {12, 21}, hasChildren: false, reference: "40694"), 
// AppIdentifier.cellType.detailed(text: "Title D", secondaryText: "2017-11-16T10:34:00.000+02:00", icon: <UIImage: 0x60c0002a6660>, {12, 21}, hasChildren: false, reference: "40633"), 
// AppIdentifier.cellType.detailed(text: "Title E", secondaryText: "2017-10-19T10:12:00.000+02:00", icon: <UIImage: 0x60c0002a6660>, {12, 21}, hasChildren: false, reference: "40682"), 
// ] 

var cellDataSorted = cellData.sorted(by: {$0.detailed.secondaryText < $1.detailed.secondaryText}) 

// Swift Compiler Error: enum element ’detailed’ cannot be referenced as an instance member 

ソートするための最良の方法だろう何この配列?前もって感謝します!ソート関数内

+0

http://www.stackoverflow.com/help/how-to-ask – sasquatch

+0

Swiftで列挙型の並べ替えと配列の検索をお勧めします。私はこの質問が以前に答えられたと確信しています。そうでない場合は、自分で質問に答えるのに役立つ質問が間違いなくあります。 – Fogmeister

+0

@sasquatch私はそのページを読んでいます。あなたが好きではなかったことを教えてください。私はそれを修正して次回はもっとうまくやることができます。ありがとう。 – Marc

答えて

1

(私は電話でこれを書いて、その必要があれば..構文を修正しています)

次のコードを使用:

if case .detailed(_, let date0, _, _, _) = $0, case .detailed(_, let date1, _, _, _) = $1 { 
    return date0 < date1 
} else { 
    // One of them didn't have date (should never happen) 
    return true 
} 

あなたの問題は、あなたがアクセスしているということであり、それがクラス/構造体のインスタンスであるかのように、列挙型のパラメータ。

+1

ありがとう@ダニエル。これは意図したとおりに動作し、配列は適切にソートされます。しかし、 'date0'と' date1'は定数 '' let date0''と 'let date1''を定義する必要があります。それに応じてあなたの答えを編集できますか? – Marc

+1

私は 'let'sで答えを更新しました – Daniel

関連する問題