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

Swift中为何基本类型整数无法作为Thread参数正常传递?

问题原因及解决方案

核心原因有两点:

  1. Thread方法的参数签名不匹配
    Thread的init(target:selector:object:)要求对应的selector方法必须接受一个Any?(对应Objective-C的id对象类型)参数。你声明的run_with_uint(param: UInt)是值类型参数,桥接到Objective-C后签名变为接受NSUInteger基本类型,但Thread传递的是被Swift自动装箱成NSNumber的对象,这就导致方法调用时参数解析错误,拿到了错误的数值。

而String是引用类型,传递时直接对应Objective-C的NSString对象,和方法参数类型匹配,所以能正确接收。

  1. os_log格式符与参数类型不匹配
    你用%ld(有符号长整型格式符)打印无符号的UInt,会触发符号扩展问题,导致输出错误的负数。64位系统中UInt对应UInt64,应该使用%llu(无符号64位整数格式符)。

修复后的代码

@objc func run_with_uint(param: Any?) {
    guard let uintParam = param as? UInt else { 
        os_log("参数类型错误")
        return 
    }
    os_log("run_with_uint: %llu", uintParam)
}

@objc func run_with_str(param: String) {
    os_log("run_with_str: %s", param)
}

@IBAction
func onStartClick(sender: UIButton) {
    let param: UInt = 12345678
    let t1 = Thread.init(target: self, selector: #selector(run_with_uint), object: param)
    t1.start()
    let t2 = Thread.init(target: self, selector: #selector(run_with_str), object: String(param))
    t2.start()
}

修复后输出会正常显示run_with_uint: 12345678。

内容的提问来源于stack exchange,提问作者progquester

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:35:19