避免在Swift的排序封闭中强制展开

时间:2018-08-26 14:26:25

标签: swift

我正在尝试根据可选Int属性对对象数组进行排序。

// sorting each language array based on most stars
groupedDictionariesValueUnwrapped.sort(by: { $0.stars! > $1.stars!  })

数组的类型为[SingleRepository],SingleRepository具有可选的Int。星:Int?

如何避免在排序内部强行展开?

2 个答案:

答案 0 :(得分:6)

您正在按降序排序。

使用 nil合并运算符 ??安全地解包值,并将nil替换为Int.min,以将项目放置在数组的末尾:< / p>

// sorting each language array based on most stars
groupedDictionariesValueUnwrapped.sort(by: { ($0.stars ?? Int.min) > ($1.stars ?? Int.min) })

或使用?? Int.max将其放在开头。

答案 1 :(得分:1)

如果对您的类/结构有意义,则可以将Comparable的符合性添加到要排序的类型:

extension MyClass: Comparable {
    public static func ==(lhs: MyClass, rhs: MyClass) -> Bool {
        return (lhs.stars ?? 0) == (rhs.stars ?? 0)
    }

    public static func <(lhs: MyClass, rhs: MyClass) -> Bool {
        return (lhs.stars ?? 0) < (rhs.stars ?? 0)
    }
}

然后您就可以直接使用>运算符功能(符合Comparable会调出所有其他比较运算符>>=,{{1} }):

<=

“有道理”是指基于groupedDictionariesValueUnwrapped.sort(by: >) 属性符合Comparable的事实,为类型定义增加了价值(例如,类型命名为stars包含有关用户评论的信息。