You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS/Swift中UILocalizedIndexedCollation的collationStringSelector调用失败

解决UILocalizedIndexedCollation找不到已定义选择器的问题

最近在使用UILocalizedIndexedCollation的collationStringSelector方法时踩了个实打实的坑——明明已经按要求定义了选择器,程序却死活识别不到。先把我的场景代码贴出来,方便大家对照排查:

先看协议与类的定义

我首先定义了一个协议,要求实现用于排序的属性:

protocol ContactProtocol {
    var lastName: String { get }
}

然后创建了遵循该协议的Contact类:

class Contact: ContactProtocol {
    let lastName: String
    
    init(lastName: String) {
        self.lastName = lastName
    }
}

出错的调用代码

接着尝试用UILocalizedIndexedCollation处理排序逻辑:

let collation = UILocalizedIndexedCollation.current()
collation.collationStringSelector = #selector(getter: ContactProtocol.lastName)
// 这里直接报错,提示找不到对应的选择器

问题的关键解决办法

折腾了好半天才摸清楚根源:Contact类必须继承自NSObject!

因为UILocalizedIndexedCollation是基于Objective-C运行时机制实现的,只有继承自NSObject的类,它的属性才能被Objective-C的选择器系统识别到。另外,协议也最好加上@objc标记,确保能被OC runtime正确感知。

修改后的代码如下:

@objc protocol ContactProtocol {
    var lastName: String { get }
}

class Contact: NSObject, ContactProtocol {
    let lastName: String
    
    init(lastName: String) {
        self.lastName = lastName
        super.init()
    }
}

这样再调用collationStringSelector就不会报错,排序功能也能正常工作了。

内容的提问来源于stack exchange,提问作者Michał Ziobro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:43:59