Swift中为何基本类型整数无法作为Thread参数正常传递?
问题原因及解决方案
核心原因有两点:
- 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对象,和方法参数类型匹配,所以能正确接收。
- 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
相关产品推荐
相关产品推荐

