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.Int1Bool 结构的内部表示(结构的_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 中将 NSData 转换为数据?

Swift 3 ObjectMapper - 将 URLSession 结果转换为 Map 对象失败

Swift 3:将 SHA256 哈希字符串转换为 SecCertificate

在swift 3中将字节数组转换为PDF