Swift - 如何按字母顺序对注释数组进行排序

3
我的项目是一个地图,上面有很多注释点,用户可以通过 pickerView 查找特定的注释。一切都很好,除了所有注释点的列表似乎是随机显示的。我想按字母顺序对注释进行排序。
这是我的当前工作代码:
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        return self.mapView.annotations[row].title ?? "No title"

    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        self.mapView.selectAnnotation(self.mapView.annotations[row], animated: true)
    }

我尝试过实现这个,但没有成功...


(我已经尝试过,但是没有成功)
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

let sortedNames = self.mapView.annotations.sorted(by: {$0.title < $1.title})
        return sortedNames[row].title ?? "No title"

    }

我遇到了这个错误:

无法将类型为 'String??' 的值转换为预期的参数类型 'UIContentSizeCategory'

有什么提示将不胜感激。

为什么不直接对创建注释时使用的名称列表进行排序,而不是尝试对注释进行排序呢?值得指出的是,sortedNames 实际上是按标题排序的 MKMapAnnotation 数组。如果你真的需要这样做,你可以像这样将它转换为字符串数组:let sortedNames = self.mapView.annotations.sorted(by: {$0.title < $1.title}).flatMap({ $0.title }) - creeperspeak
似乎每行在选择器中排序整个列表的字母顺序也不是很明智。为什么不只维护一个标题列表,这样你可以排序一次,然后在获取选择器标题时继续访问该列表? - creeperspeak
因为注释的顺序每次都会改变,所以我请求了注释...而且我只有25个注释。 - Hugo75
2个回答

8

我知道这个问题有点旧,但是对于其他遇到此问题的人来说,问题在于字符串不能是可选的。解决方法是要么提供一个默认值,要么强制解包它。例如,下面是一个解决方案:

let sortedNames = self.mapView.annotations.sorted(by: { ($0.title ?? "") < ($1.title ?? "") }))
return sortedNames[row].title ?? "No title"

就是这样,兄弟!运行得很好,对吧?)+1 - Itapox
无法工作...仍然出现错误 Binary operator '<' cannot be applied to two 'String?' operands - Kegham K.
@KeghamK。这意味着它们仍然是可选字符串。您需要提供一个默认值,将它们从“String?”转换为“String”。这将允许您使用二进制运算符进行比较。 - Jack Hopkins
1
@JackHopkins 找到了问题所在。MKAnnotation.title 的类型是 String??,它是一个嵌套的可选项,因此您需要两次可选绑定。https://stackoverflow.com/questions/52605162/if-let-doesnt-unwrap-optional-value-for-mkannotations-title-property - Kegham K.

0

当我尝试按字符串属性对不同类别的数组进行排序时,我刚刚遇到了这个错误。问题似乎在于您要排序的属性是可选的。使用非可选属性会按预期工作,而使用可选属性会导致相当奇怪的“UIContentSizeCategory”错误。

像这样的代码应该可以满足您的需求:

   let sorted = self.mapView.annotations { (a1, a2) -> Bool in
            if let s1 = a1.title {
                if let s2 = a2.title {
                    return s1 > s2
                }
            }
            return false
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接