将UIImage.size转换为字符串时遇到初始化匹配错误的问题
将UIImage.size转换为字符串时遇到初始化匹配错误的问题
嘿,我来帮你排查这个问题~你遇到的这个“No exact matches in call to initializer”错误,其实是因为UIImage.size的width和height是CGFloat类型,而Swift的String初始化器并没有直接对应CGFloat的精确实现——毕竟CGFloat是个类型别名,在不同设备架构下可能对应Float或者Double,编译器没法确定该调用哪个初始化方法,所以就报错啦。
你原来的代码用了强制解包image!,先不说安全问题,核心问题就是CGFloat转String的歧义。给你几个简单的解决办法:
方法1:转成明确数值类型后再拼接
用可选绑定替代强制解包更安全,同时把CGFloat转成Double或Int这类明确的数值类型,再转成字符串:
if let image = image { // 转成Double可以保留小数,适合需要精确尺寸的场景 let widthStr = String(Double(image.size.width)) let heightStr = String(Double(image.size.height)) mediaSize = "\(widthStr)|\(heightStr)" // 如果只需要整数尺寸,直接转Int更简洁: // mediaSize = "\(Int(image.size.width))|\(Int(image.size.height))" }
方法2:用格式化字符串直接处理
如果需要灵活控制输出格式(比如保留几位小数),可以用String(format:)的方式,它能直接兼容CGFloat:
if let image = image { // %.0f表示取整数输出,要是需要保留两位小数就改成%.2f mediaSize = String(format: "%.0f|%.0f", image.size.width, image.size.height) }
另外多提一句,哪怕你确定image是有效的,也尽量少用!强制解包,用if let或者guard let的可选绑定写法,代码会更健壮,也更符合Swift的安全编码规范哦~
备注:内容来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

