我对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复制到项目中的文件夹中。
任何建议都将不胜感激
答案 0 :(得分:2)
问题是sharedInstance
应该在班级中定义为static
,例如:
static let sharedInstance = ModelManager()
然后,只要您需要引用此单例,就可以引用ModelManager.sharedInstance
(而不仅仅是sharedInstance
)。
查看此代码示例,我认为作者希望您将此sharedInstance
实现为全局,但我认为这是一个糟糕的决定。最好将它设为ModelManager
的类属性,以避免污染您的命名空间。
虽然我们正在谈论设计选择,但本教程使用getInstance
方法是一个糟糕的设计选择。首先,它不是线程安全的。其次,它也打破了单例模式(即你必须引用这个方法,而不是sharedInstance
属性......他的代码示例使用两者,这真的很糟糕)。我建议完全从代码中删除getInstance
,并将FMDatabase
实例的初始化合并到init
方法ModelManager
中。然后,您可以在需要访问此单例的任何位置引用ModelManager.sharedInstance
,并消除线程安全问题以及对getInstance
的依赖。
关于.dylib
vs .tbd
文件,没问题。 Xcode用于提供dylib
个文件,但许多文件已被这些tbd
文件替换。请参阅https://stackoverflow.com/a/32115656/1271826。
如果您仍然看到"使用未解析的标识符' FMDatabase'"错误,请确保
您已将FMDB *.m
文件包含在您的目标中(您可以通过转到"编译源""构建阶段"标签下的部分确认目标设置);和
确保在您的桥接头文件中包含#import "FMDB.h"
。