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

参数标签(_:)与可用重载不匹配问题咨询(代码报错行: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:19:52