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

为何UIColor的getRed方法漏加&时Xcode报错提示与自定义inout函数不一致

为什么相同错误Xcode报错提示不一致
  • UIColor的getRed是Objective-C桥接到Swift的API,它的原生参数类型是UnsafeMutablePointer<CGFloat>?(可变指针类型),并不是Swift原生的inout参数。Swift提供了语法糖支持用&+变量的方式给这类指针参数传值,但底层的参数类型校验逻辑和原生inout参数完全不同。
  • 你自定义的函数使用了Swift原生inout参数,编译器对这类参数有专门的检查逻辑,当检测到传值未加&时会直接输出针对性的提示。
  • 你使用的Xcode 12.5.1版本没有针对ObjC桥接的指针参数场景做额外的报错优化,所以只会输出通用的「类型不匹配,无法转为指针」的错误。更高版本的Xcode(14+)已经针对这类常见场景补充了漏写&的提示。
不用inout参数的替代方案

直接调用系统的getRed方法必须传入可变指针,也就是必须使用&+变量的写法,没有其他直接调用的方式。但你可以通过扩展UIColor的方式封装实现,对外暴露不需要inout参数的接口,示例代码如下:

extension UIColor {
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0
        getRed(&r, green: &g, blue: &b, alpha: &a)
        return (r, g, b, a)
    }
}

封装完成后你可以直接取值使用,不需要处理inout参数:

let color = UIColor.blue
let red = color.rgba.red
let green = color.rgba.green
// 其余值同理获取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:03