Swift调用初始化方法报Missing argument for parameter in call错误求解
你遇到的两个报错都是serviceID: characteristic.service?.uuid ??, 这行的语法错误触发的连锁问题,具体说明如下:
问题1报错原因
Swift编译器在解析到??空合运算符时发现没有右侧表达式,直接判定当前行语法无效,无法识别你已经写了serviceID参数的赋值逻辑,误以为你漏传了serviceID参数,才会弹出缺失参数的报错提示。
问题2报错原因
??是Swift的二元空合运算符,要求必须同时有左操作数和右操作数,作用是当左操作数为nil时返回右操作数作为 fallback 值。你只写了左操作数characteristic.service?.uuid,没有提供右操作数,所以直接触发「Expected expression after operator」的语法错误。
修复方案
你需要根据业务逻辑选择对应的修复方式,同时还要注意你当前代码里peripheralID的赋值也存在类型不匹配的问题:characteristic.service?.peripheral返回的是CBPeripheral实例,你需要取它的identifier属性才能匹配PeripheralID(一般为UUID类型)的类型要求。
方案1:确定service一定非空时用强制解包
如果你能保证当前上下文传入的CBCharacteristic一定关联了service,可以直接把空合运算符替换为强制解包:
extension QualifiedCharacteristic { init(_ characteristic: CBCharacteristic) { self.init( id: characteristic.uuid, serviceID: characteristic.service!.uuid, peripheralID: characteristic.service!.peripheral.identifier ) } }
方案2:提供默认 fallback 值
如果允许service为nil时用默认值填充,给??补充右侧的默认值即可:
extension QualifiedCharacteristic { init(_ characteristic: CBCharacteristic) { self.init( id: characteristic.uuid, serviceID: characteristic.service?.uuid ?? CBUUID(string: "你预设的默认服务UUID"), peripheralID: characteristic.service?.peripheral.identifier ?? UUID() ) } }
方案3:service为nil时初始化失败,使用可失败初始化器
如果service为nil时该实例没有业务意义,建议改成可失败初始化器,避免非法实例生成:
extension QualifiedCharacteristic { init?(_ characteristic: CBCharacteristic) { guard let service = characteristic.service, let peripheral = service.peripheral else { return nil } self.init( id: characteristic.uuid, serviceID: service.uuid, peripheralID: peripheral.identifier ) } }
内容的提问来源于stack exchange,提问作者Sean H.
相关产品推荐
相关产品推荐

