OC转Swift时遇‘无法将NSNull转为预期参数类型’错误求助
解决Swift中插入nil/NSNull到数组的类型不匹配问题
刚把OC代码转Swift时碰到这种类型错误太正常了——毕竟OC的数组是“什么都能装”的动态类型,而Swift的数组可是严格的强类型选手!
错误根源
你的Objective-C代码用[sortedHours insertObject:[NSNull null] atIndex:i]没问题,因为OC的NSArray可以容纳任意对象(用NSNull当占位符)。但到了Swift里,如果你的sortedHours是[GymHours]类型(只能存GymHours实例的非可选数组),它根本不接受nil或者NSNull,这就触发了类型不匹配的错误。
修复方案
我们只需要把数组类型改成可选元素数组[GymHours?],让它既能存GymHours实例,也能存nil(对应OC里的NSNull占位符)。下面是修正后的完整代码:
// 声明数组为可选元素类型,允许容纳GymHours实例或nil var sortedHours: [GymHours?] = gymDetail.hours.sorted(by: { $0.startTime < $1.startTime }) let gymdays = GymHours.orderedDays() for i in 0..<gymdays.count { var pad = false if i >= sortedHours.count { pad = true } else { // 解包可选值,避免后续操作的可选性隐患 guard let hours = sortedHours[i] else { pad = true continue } print(GymHours.orderedDays()[i]) if hours.day == GymHours.orderedDays()[i] as! String { pad = true } } if pad { // 直接插入nil作为占位符,完美对应OC的NSNull逻辑 sortedHours.insert(nil, at: i) } }
补充说明
为什么用nil而非NSNull?
Swift的可选数组原生支持用nil表示缺失元素,这比引入Foundation的NSNull更符合Swift的类型设计。如果之后需要和OC代码交互,Swift数组里的nil会自动转换成NSNull,完全兼容原有逻辑。类型转换小细节
原来的sorted方法返回的是[GymHours](非可选数组),直接赋值给[GymHours?]类型的变量时,Swift会自动把每个元素包装成可选值,不需要额外写map转换(当然显式写.map { $0 as GymHours? }也没问题)。
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

