代碼 Swift 化的挑戰

做者:Erica Sadun,原文連接,原文日期:2016-06-28
譯者:Martin_Joy;校對:bestswifter;定稿:CMBgit

今天的挑戰題出自 Swift Users 郵件組的 Adriano Ferreira 。他的出發點是想要簡化鏈式調用,可是不少狀況下,想要使代碼更 Swifter ,僅僅依靠看起來漂亮的鏈式語法是不夠的。github

func selectionSort(_ array: [Int]) -> [Int] {

    guard array.count > 1, let minElement = array.min() else {
        return array
    }

    let indexOfMinElement = array.index(of: minElement)!

    // All of this just to filter out the first smallest element and return the rest
    // Also tried ‘suffix(from:)' here, but couldn’t make it work properly
    let rest = array.enumerated()
                    .filter({ index, _ in index != indexOfMinElement })
                    .map({ _, element in element })

    return [minElement] + selectionSort(rest)
}

如何使其更 Swifter

首先,實用性。即便對於零個或一個元素的數組,我不認爲添加代碼去測試這些條件是實用的。我認爲讓代碼直接順序執行是更好的選擇,即便這樣對於只有一個元素的狀況不是特別完美。swift

其次,連貫性。我不喜歡先找到最小值,而後再去找它的索引的想法。而枚舉是容許將這兩個操做串聯起來的。數組

第三,風格。數組的遍歷應該返回元組類型 (index: Index, value: Element)。可是示例並無這麼作,因此我想要藉此機會來擴展數組,使其支持這種類型的元組。同時,個人方案比他須要的答案更復雜一些,由於我想要使用 $0.value$1.index,而不是使用 $0.1$1.0測試

我從新設計的代碼在這裏,請你也分享你的那一份吧!this

本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 http://swift.gg翻譯

相關文章
相關標籤/搜索