Swift 3 转换获取 'Int1' 不能转换为 'Bool'
Posted
技术标签:
【中文标题】Swift 3 转换获取 \'Int1\' 不能转换为 \'Bool\'【英文标题】:Swift 3 conversion gets 'Int1' is not convertible to 'Bool'Swift 3 转换获取 'Int1' 不能转换为 'Bool' 【发布时间】:2016-09-17 16:06:48 【问题描述】:我正在将可编译并运行的 Swift 2 代码转换为 Swift 3,但出现以下错误:
'Int1' 不能转换为 'Bool'
代码如下:
isUpdated = sharedInstance.database!.executeUpdate(
"UPDATE Coin_Table SET upgrade=?, grade=?, WHERE coin_id=?",
withArgumentsInArray: [
coinInfo.upgrade, (coinInfo.grade != nil) ? coinInfo.grade! : NSNull(),
coinID])
上面的代码是使用FMDB和FMDB.h中定义的方法为
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;
在上面编译我的代码时,它会标记“(coinInfo.grade!=”并给出错误。
我尝试简化它,看看它是否仍然会发生:
let theArray: NSArray = [true ? "foo" : NSNull()]
仍然得到同样的错误,这次它标记为“真”。
我对此进行了大量搜索,除了https://bugs.swift.org/browse/SR-2372 之外没有找到任何接近的东西,但这是元组的问题,我认为它不会影响我的代码。
如果这是一个编译器错误,任何人都可以对此有所了解或提出解决方法吗?
谢谢
【问题讨论】:
Builtint.Int1
是Bool
结构的内部表示(结构的_value
属性),并且这种类型在错误/警告消息中弹出通常指向非预期行为从编译器。您链接的错误报告似乎也解释了这种行为>编译器无法推断三元运算结果的类型。例如。使用字符串文字显式初始化NSString
实例(而不是信任编译器)将规避错误(let theArray: NSArray = [true ? NSString(string: "foo") : NSNull()]
)。
感谢您的评论。实际上,我已经简化了用于发布问题的实际代码,因为我在同一行上有多个插入,所以这种方法对我来说有点笨拙。使用下面的临时变量方法。
【参考方案1】:
正如您自己写的那样,您的问题与here 描述的问题相同。错误发生))
为什么不直接使用临时变量来修复它:
let hasGrade: Any = (coinInfo.grade != nil) ? coinInfo.grade! : NSNull()
isUpdated = sharedInstance.database!.executeUpdate(
"UPDATE Coin_Table SET upgrade=?, grade=?, WHERE coin_id=?",
withArgumentsInArray: [
coinInfo.upgrade, hasGrade,
coinID])
【讨论】:
谢谢,这让我解决了这个问题,之前没有使用过“任何”。 有时当您的代码中出现其他错误时会显示此错误。我对此感到困惑,但后来我发现该行还有另一个错误,xcode 没有报告,当我修复它时,这个错误就消失了。以上是关于Swift 3 转换获取 'Int1' 不能转换为 'Bool'的主要内容,如果未能解决你的问题,请参考以下文章
不能使用 String 类型的索引为 NSDictionary 类型的值下标。从 Swift 2.3 -> 3.2 转换时
获取“无法打开应用程序,因为您无权查看它。 “将项目代码从swift 2.2转换为swift 3.0之后
Swift 3 ObjectMapper - 将 URLSession 结果转换为 Map 对象失败