iOS13适配:如何解决Xcode中Selector构造的警告问题
解决iOS13适配下Selector警告问题
方案一:封装兼容的@objc比较方法
自己给NSTextLocation扩展一个带@objc标记的比较方法,既满足Xcode对#selector的要求,又不依赖iOS15+的API:
extension NSTextLocation { @objc func compatibleCompare(_ other: NSTextLocation) -> ComparisonResult { return self.compare(other) } } // 调用时使用自定义方法的selector let argsort = (scores as NSDictionary?)?.keysSortedByValue(using: #selector(NSTextLocation.compatibleCompare(_:)))
compare(_:)本身在iOS13就已存在,只是官方直接暴露的#selector绑定需要iOS15,通过自定义方法就能绕过版本限制。
方案二:单独禁用语句警告
如果不想改动代码结构,可给这条语句单独添加警告忽略指令:
// swiftlint:disable:next selector_name let argsort = (scores as NSDictionary?)?.keysSortedByValue(using: Selector("compare:"))
或者用Clang编译器指令:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-selector" let argsort = (scores as NSDictionary?)?.keysSortedByValue(using: Selector("compare:")) #pragma clang diagnostic pop
方案三:改用Swift原生排序逻辑
直接抛弃NSDictionary的方法,用Swift原生字典的排序实现,彻底摆脱Selector相关问题:
if let scoresDict = scores as? [NSTextLocation: Any] { let argsort = scoresDict.keys.sorted { $0.compare($1) == .orderedAscending } }
这种方式完全符合Swift编码习惯,兼容所有iOS版本,也不会产生任何警告。
内容的提问来源于stack exchange,提问作者vib
相关产品推荐
相关产品推荐

