Swift 中 SQLITE_TRANSIENT 未定义

22

我正在使用Xcode 6,已经导入了libsqlite3.dyliblibsqlite3.0.dylib。我也添加了Bridging-Header.h文件,它导入了sqlite3.h

我可以打开SQLite数据库并进行插入、选择等简单操作...

使用if (sqlite3_bind_text(compiledStatement, 2, Name.cStringUsingEncoding(NSUTF8StringEncoding), -1, SQLITE_TRANSIENT) != SQLITE_OK)

我遇到了一个错误:未解析的标识符“SQLITE_TRANSIENT”

我该怎么办?我是Swift新手,这是我在Stack上的第一个问题,请有人帮帮我!


请展示一些代码,例如如何导入sqlite3.h头文件? - Dharmesh Kheni
在我的 Bridging-Header.h 文件中,我添加了 #import <sqlite3.h>。我认为这是因为在我的 sqlite3.h 文件中没有定义 SQLITE_TRANSIENT 和 SQLITE_STATIC,因为我可以使用其他常量,如 SQLITE_OK、SQLITE_DONE。 - Chongzl
是的,错误就是这样说的。 - Dharmesh Kheni
1个回答

37

定义

#define SQLITE_STATIC      ((sqlite3_destructor_type)0)
#define SQLITE_TRANSIENT   ((sqlite3_destructor_type)-1)

来自<sqlite3.h>的内容在Swift中没有被导入,可能是由于“不安全”的指针转换。
一个可能的Swift定义在SQLite.swift项目中,位于Statement.swift:
let SQLITE_STATIC = sqlite3_destructor_type(COpaquePointer(bitPattern: 0))
let SQLITE_TRANSIENT = sqlite3_destructor_type(COpaquePointer(bitPattern: -1))

对于Swift 2,您需要

let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self)
let SQLITE_TRANSIENT = unsafeBitCast(-1, sqlite3_destructor_type.self)

我是一个有用的助手,可以为您翻译文本。

以下内容摘自SQLite.swift项目Swift 2分支中的"Helpers.swift"

更新至Swift 3:

let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)

Swift4怎么样? - Jayprakash Dubey
@JayprakashDubey:如果它在Swift 3和Swift 4.2中运行正常,那么我强烈认为它也适用于Swift 4。你有问题吗? - Martin R
@MartinR:我的错误...它正常工作了!点赞为答案。 - Jayprakash Dubey
我知道这是Swift,而不是Objective-C,但您是否应该为每个常量名称添加三个字母的前缀,例如将它们更改为“WOZ_SQLITE_STATIC”和“WOZ_SQLITE_TRANSIENT”,以避免命名冲突(例如,在苹果在未来的版本中修复此问题时)? - ma11hew28
1
@ma11hew28:我认为这并不必要,因为Swift模块已经包含了。如果最终从libsqlite导入SQLITE_STATIC,则其完全限定名称将是SQLite3.SQLITE_STATIC,而您自己的常量将是YourAppModule.SQLITE_STATIC。 - Martin R
@MartinR,好的,谢谢。这很有道理。但是,如果我在代码中使用未限定的名称,那么我认为我的本地声明将覆盖SQLite3(如果将来导入)。因此,理想情况下,我们可能希望分别在#ifndef SQLITE_STATIC#ifndef SQLITE_TRANSIENT内部包装每个定义?但是我不知道如何在Swift中实现这一点。无论如何,这可能没问题,因为SQLite的开发人员可能不会更改这些常量的定义。 - ma11hew28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接