为何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
相关产品推荐
相关产品推荐

