2017-07-30 56 views
0

我在我的項目的結構如下:排序與子結構的結構體在斯威夫特

struct templateScheduleResponse: Decodable { 
    let templateScheduleTypes: [scheduleTemplateType] 
} 

struct scheduleTemplateType: Decodable { 
    let templateScheduleNames: [templateScheduleName]? 
    let templateTypeId: String? 
    let templateTypeName: String 
} 

struct templateScheduleName: Decodable { 
    let templateNameId: String? 
    let templateSchedName: String 
} 

,我想,這樣templateScheduleName的陣列由templateSchedName值排序來排序。

我完全停留在如何做到這一點。

任何指針,請? (我剛剛開始學習Structs,如果你說不出來!)

謝謝!

UPDATE:這是我的JSON數據:

所有結構名的
{ 
    templateScheduleTypes =  (
       { 
      templateScheduleNames =    (
           { 
        templateNameId = "fad562bc-4510-49ea-b841-37a825a2f835"; 
        templateSchedName = "Daily_Intensive"; 
       }, 
           { 
        templateNameId = "fdeeb79f-6321-4ff6-b1f0-8272a018e73b"; 
        templateSchedName = "Weekly_Full_Log_Directories"; 
       }, 
           { 
        templateNameId = "84f9800f-da18-44b8-822f-830069dcc594"; 
        templateSchedName = "Weekly_Full"; 
       }, 
           { 
        templateNameId = "47a6f050-13d7-4bf6-b5db-ab53e0a3aa54"; 
        templateSchedName = "Weekly_Full_Catalog_Two_Weeks"; 
       }, 
           { 
        templateNameId = "b8ef9577-e871-4d79-8d3a-cfe958c0c3aa"; 
        templateSchedName = "Weekly_Full_Over_WAN"; 
       }, 
           { 
        templateNameId = "8d507f52-0d74-404e-ad0d-76e6a7a94287"; 
        templateSchedName = "Monthly_Full"; 
       } 
      ); 
      templateTypeId = "4e73b9ea-71d0-4abd-83c6-7d7b6d45641b"; 
      templateTypeName = datalist; 
     }, 
       { 
      templateScheduleNames =    (
           { 
        templateNameId = "39386552-45a5-4470-b152-7be00583e767"; 
        templateSchedName = "Scheduled_Exchange_Server"; 
       } 
      ); 
      templateTypeId = "a7c28240-c187-4f86-818c-efd86fb26c7d"; 
      templateTypeName = MSESE; 
     }, 
       { 
      templateScheduleNames =    (
           { 
        templateNameId = "0037846c-d1fe-4c8f-8eec-c62681a12a57"; 
        templateSchedName = "Scheduled_Exchange_Single_Mailbox"; 
       } 
      ); 
      templateTypeId = "9e06f06a-11dc-44b8-97a0-68bd0b45a07a"; 
      templateTypeName = Mailbox; 
     } 
    ); 
} 

回答

1

首先應以大寫字符開頭。

要回答你的問題,你需要做TemplateScheduleName

struct TemplateScheduleName: Decodable { 
    let templateNameId: String? 
    let templateSchedName: String 
} 

符合Comparable

extension TemplateScheduleName: Comparable { 

    static func ==(lhs: TemplateScheduleName, rhs: TemplateScheduleName) -> Bool { 
     return lhs.templateSchedName == rhs.templateSchedName 
    } 

    public static func <(lhs: TemplateScheduleName, rhs: TemplateScheduleName) -> Bool { 
     return lhs.templateSchedName < rhs.templateSchedName 
    } 
} 

現在給出

let list : [TemplateScheduleName] = [] 

您可以輕鬆地對它進行排序

let sortedList = list.sorted() 
+0

謝謝,但是如果我有一個TemplateScheduleResponse(頂層結構)的列表,我如何在日程表名稱內對ORDER進行排序? – FlatDog

+0

我不符合可比性。無論如何,'sorted'可以接受關閉,並且沒有任何理由推斷這個排序標準可以定義相等性 – Connor

2

您可以進行臨時排序而不必符合Comparable。如果x是類型templateScheduleType的一些變量:

x.templateScheduleNames.sorted(by: { (lhs, rhs) -> Bool in 
    return lhs.templateSchedName < rhs.templateSchedName 
}) 

如果你想確保陣列在施工時間地點分類,定義上scheduleTemplateType的init方法就像你在一個類:

init(scheduleNames: [templateScheduleName], typeID:String?, typeName:String) { 
    self.templateScheduleNames = scheduleNames.sorted(by: { (lhs, rhs) -> Bool in 
     return lhs.templateSchedName < rhs.templateSchedName 
    }) 
    self.templateTypeId = typeID 
    self.templateTypeName = typeName 
} 
+0

啊!謝謝。 init方法看起來更有希望。但排序順序似乎仍然不正確,它出現如下:http://imgur.com/a/WJrN7 – FlatDog