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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:03:01