我对 iOs 开发还很陌生,我正在尝试遵循 this tutorial
一切似乎都工作正常,但是当我创建 ModelManager 类时,代码无法构建,并出现以下错误
class ModelManager{
let sharedInstance = ModelManager()
class func getInstance() -> ModelManager
{
if(sharedInstance.database == nil) //Instance member 'sharedInstance' cannot be used on type 'ModelManager'
{
sharedInstance.database = FMDatabase(path: Utility.getPath("FirstAscent.sqlite")) ///Use of unresolved identifier 'FMDatabase'
}
return sharedInstance //Instance member 'sharedInstance' cannot be used on type 'ModelManager'
}
}
在本教程的前面部分,我也找不到 libsqlite3.0.dylib
文件将其作为二进制文件与我的库链接,但我已经链接了 .tbd
文件相反。
我还按照指示将 fmdb 复制到了我的项目中的文件夹中。
如有任何建议,我们将不胜感激
最佳答案
问题在于
sharedInstance
应该在类中定义为static
,例如:static let sharedInstance = ModelManager()
然后,每当您需要引用此单例时,您都可以引用
ModelManager.sharedInstance
(不仅仅是sharedInstance
)。查看此代码示例,我认为作者希望您将这个
sharedInstance
实现为全局,但我认为这是一个糟糕的决定。最好将其设为ModelManager
的类属性,以避免污染您的命名空间。虽然我们正在讨论设计选择,但本教程使用
getInstance
方法是一个糟糕的设计选择。首先,它不是线程安全的。其次,它也打破了单例模式(即您必须引用此方法,而不是sharedInstance
属性……他的代码示例同时使用了这两个方法,这非常糟糕)。我建议从代码中完全删除getInstance
,并将FMDatabase
实例的初始化合并到ModelManager< 的
。然后,您可以在任何需要访问该单例的地方引用init
方法中ModelManager.sharedInstance
,这样就消除了线程安全问题以及对getInstance
的依赖。关于
.dylib
与.tbd
文件,这很好。 Xcode 曾经提供 dylib 文件,但许多文件已被这些 tbd 文件替换。请参阅https://stackoverflow.com/a/32115656/1271826 .如果您仍然看到“使用无法解析的标识符‘FMDatabase’”错误,请确保
您已将 FMDB
*.m
文件包含到您的目标中(您可以通过转到目标设置下“构建阶段”选项卡的“编译源”部分来确认);和确保在桥接头文件中包含
#import "FMDB.h"
。
关于swift - 实现 FMDatabase 时遇到的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38581917/