参数标签(_:)与可用重载不匹配问题咨询(代码报错行:border.lineDash...)
解决Swift中
NSNumber初始化的参数标签错误问题 嘿,这个问题我之前也碰到过!你遇到的Argument label (_:) do not match any available overload错误,根源在于Swift里NSNumber的初始化规则——直接用NSNumber(segmentSize)这种不带参数标签的写法已经不再被支持了。
错误原因
在Swift的后续版本中,为了API一致性和类型安全,移除了NSNumber无标签的初始化重载,现在必须明确指定参数标签或者通过类型转换来创建NSNumber实例。你的错误就出在border.lineDashPattern = [NSNumber(segmentSize), segmentSize]这行:第一个NSNumber(segmentSize)没有正确的参数标签,而且第二个segmentSize是Int类型,不能直接放进需要NSNumber数组的lineDashPattern里。
修复后的完整代码
func decorate(_ element:UIView, borderSize:Int, borderColor:UIColor, dashed:Bool) { let segmentSize = borderSize * 2 let border = CAShapeLayer() border.strokeColor = borderColor.cgColor border.fillColor = nil border.lineWidth = CGFloat(borderSize) if dashed { // 方式1:使用带value:标签的NSNumber构造器(兼容性更好) border.lineDashPattern = [NSNumber(value: segmentSize), NSNumber(value: segmentSize)] // 方式2:通过类型转换简化写法(更简洁) // border.lineDashPattern = [segmentSize as NSNumber, segmentSize as NSNumber] } border.path = UIBezierPath(rect: element.bounds).cgPath border.frame = element.bounds element.layer.addSublayer(border) }
两种修复方式说明
- 方式1:调用
NSNumber(value:)构造器,明确传入要包装的数值,这是官方推荐的标准初始化方式,在各个Swift版本中兼容性都很好。 - 方式2:利用Swift的类型转换特性,直接将
Int类型的segmentSize转为NSNumber,写法更简洁,适合追求代码精简的场景。
另外还要注意:lineDashPattern要求的是[NSNumber]?类型,所以数组里的每个元素都必须是NSNumber类型,不能直接放Int,这也是原来代码里第二个segmentSize会隐含问题的地方,两种修复方式都解决了这个问题。
内容的提问来源于stack exchange,提问作者Talha Shafaqat
相关产品推荐
相关产品推荐

