Objective-C转Swift报错:Int类型表达式无法匹配uint?类型
解决Swift中表达式模式类型不匹配的问题
嘿,这个问题我之前帮朋友排查过,咱们先搞清楚报错的根源,再一步步修复~
错误原因拆解
你遇到的报错 expression pattern of type 'Int' cannot match values of type 'uint?' (aka 'Optional<UInt32>') 其实说的是两件事:
report.level的类型是可选的UInt32(也就是UInt32?),你直接在switch里用它,编译器不知道怎么处理nil的情况;- 你case里写的
1、2、3、4默认是Int类型,和UInt32类型不匹配——Swift是强类型语言,不会自动帮你做隐式转换。
修复方案(两种常用思路)
思路1:先解包+类型转换,再switch
先把可选的UInt32?解包,转换成和case数字一致的Int类型,这样就能正常匹配了:
class func shareLevelUp(toFacebook level: UInt32, from vc: UIViewController?) { let report = GymStatusReport.statusReportForLevel(level) // 先解包report.level,同时转成Int类型 guard let actualLevel = report.level else { return // 处理level为nil的情况 } switch Int(actualLevel) { case 1: // 执行对应逻辑 case 2: // 执行对应逻辑 case 3: // 执行对应逻辑 case 4: // 执行对应逻辑 default: return } }
思路2:直接在switch中处理可选+匹配UInt32字面量
如果你不想转类型,也可以直接在switch里处理可选值,同时把case里的数字明确指定为UInt32类型:
class func shareLevelUp(toFacebook level: UInt32, from vc: UIViewController?) { let report = GymStatusReport.statusReportForLevel(level) switch report.level { case .some(1 as UInt32): // 执行对应逻辑 case .some(2 as UInt32): // 执行对应逻辑 case .some(3 as UInt32): // 执行对应逻辑 case .some(4 as UInt32): // 执行对应逻辑 default: return // 包含nil和其他数值的情况 } }
小提示
另外注意你函数参数里的uint,Swift里标准写法是UInt32,建议改成标准命名,避免不必要的混淆~
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

