“_”不能转换为Int32 - Swift

时间:2015-07-24 16:05:45

标签: swift compiler-errors int32

得到此错误但不明白原因。

以下这一行有效。请注意,settingVersion和settingRelease都是字符串:

let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease)

但是如果我在混合中添加一个Int32,其中settingsTimesUsed是一个Int32,我得到“_”不能转换为Int32错误。

let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease, settingRecord.settingTimesUsed])

如果我将最终项目完全显式化为Int32,我也会得到同样的错误,例如

let a = 1 as Int32
let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease, a])

任何想法。

2 个答案:

答案 0 :(得分:2)

添加Int32次尝试将其从[String]移至[AnyObject]。 Swift永远不会自动推断AnyAnyObject。如果需要,您必须明确说明。在这种情况下,那将是:

let settings: [AnyObject] = [settingRecord.settingVersion, settingRecord.settingRelease, settingRecord.settingTimesUsed]
let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: settings)

那就是说,我确保你真的想要那个。这会在运行executeUpdate时抛弃类型安全性。

如果这是一个ObjC接口(通常是类型不安全的),那么它实际上可能需要NSArray。在这种情况下,您可以通过调用:

来明确
...withArgumentsInArray: NSArray(objects: settingRecord.settingVersion, settingRecord.settingRelease, settingRecord.settingTimesUsed))

答案 1 :(得分:1)

如果要保留其他变量的类型安全性,而不是将整个数组转换为“AnyObject”,您可以将该特定变量强制转换为字符串以解决此问题。

例如

let settingTimesUsedString = String(settingRecord.settingTimesUsed)

let isInserted = sharedInstance.database!.executeUpdate(sqlStatement, withArgumentsInArray: [settingRecord.settingVersion, settingRecord.settingRelease, settingTimesUsedString])