我目前正在swift中构建一个应用程序,它使用FMDB与存储在设备上的数据库进行交互。我选择使用FMDB,因为我有使用Objective C的经验,它说它支持swift。
我在执行语句时遇到了在swift中返回布尔值的问题。这是在Objective C类中使用FMDB时可用的更新函数的图像,注意绝大多数返回bool的方式
没有给我很多工作!
以下是我目前在应用中使用的现有查询(名称已更改)。
sql = @"INSERT INTO Table (IdValue, AnotherIDValue) VALUES (?, ?);";
BOOL success = [db executeUpdate:sql,
[NSNumber numberWithLong:preference.idvalue1],
[NSNumber numberWithLong:preference.idvalue2],
nil];
此语句运行后,我关闭了数据库&返回布尔值。这基本上给了我一个完成块,让我保持UI直到sql成功完成。
不幸的是,有了swift,我的工作量很少,而且我不太了解返回bool的函数输入。到目前为止,在我的swift数据库类中,我运行如下更新:
try! db.executeUpdate(sqlStatement, values: dataArray)
给我安全,如果失败,但无法返回成功布尔值。我想知道是否有人有任何建议实现数据库类,就像我在目标c中所示。
我能看到的唯一选择是在目标c中重写该类,但我更愿意保持这个应用程序100%快速。
答案 0 :(得分:1)
来自Adopting Cocoa Design Patterns “将Swift与Cocoa和Objective-C一起使用”参考:
Swift会自动将产生错误的Objective-C方法转换为根据Swift的本机错误处理功能引发错误的方法。
因此Objective-C方法
- (BOOL)executeUpdate:(NSString *)sql values:(NSArray *_Nullable)values error:(NSError *_Nullable __autoreleasing *)error
映射为
func executeUpdate(sql: String, values: [Any]?) throws
进入Swift,必须使用try
的变体调用。
如果您只对成功/失败状态感兴趣,而不是
在实际的错误消息中(如在您的目标代码中),然后
您可以使用try?
,如果评估失败,则评估为nil
:
let success = (try? db.executeUpdate(sqlStatement, values: dataArray)) != nil