Can';t将缓存库的HybridCache用于Swift

Can';t将缓存库的HybridCache用于Swift,swift,caching,Swift,Caching,我在我的应用程序中使用了Swift缓存库的HybridCache。 我将缓存库2.2.2更新为5.2.0。 然后我犯了一个错误。 这是HybridCache的错误消息 Use of unresolved identifier 'HybridCache' 这是密码 fileprivate let cache = HybridCache(name: "ReadGirl.JSONCache") 我找到了HybridCache的文章。 我把密码改成了这个 let diskConfig

我在我的应用程序中使用了Swift缓存库的HybridCache。 我将缓存库2.2.2更新为5.2.0。 然后我犯了一个错误。 这是HybridCache的错误消息

 Use of unresolved identifier 'HybridCache'
这是密码

fileprivate let cache = HybridCache(name: "ReadGirl.JSONCache") 
我找到了HybridCache的文章。

我把密码改成了这个

    let diskConfig = DiskConfig(name: "ReadGirl.JSONCache")
    let memoryConfig = MemoryConfig(expiry: .never, countLimit: 10, totalCostLimit: 10)
    fileprivate let cache = try? Storage(
        diskConfig: diskConfig,  // Error
        memoryConfig: memoryConfig
    )
但我收到了另一个错误消息“diskConfig”。 这是一条信息

Cannot use instance member 'diskConfig' within property initializer; property initializers run before 'self' is available

我必须使用一些函数来存储吗?

您正在将其他实例变量、
diskConfig
memoryConfig
传递给
cache
的初始值设定项,但由于所有属性都是同时初始化的,因此这是不可能的。但是,您可以将
缓存
标记为
惰性
,这意味着只有在第一次访问它时才会对其进行评估。第一次访问只能在封闭实例已经初始化之后发生,因此可以安全地使用
lazy
属性的初始值设定项中的另一个实例变量

let diskConfig = DiskConfig(name: "ReadGirl.JSONCache")
let memoryConfig = MemoryConfig(expiry: .never, countLimit: 10, totalCostLimit: 10)
fileprivate lazy var cache = try? Storage(
    diskConfig: diskConfig,
    memoryConfig: memoryConfig,
    transformer: TransformerFactory.forData()
)
如果您不需要从
cache
变量外部访问
diskConfig
memoryConfig
,另一种可能的解决方案是直接将它们传递到初始值设定项中,而不是将其存储为实例变量

fileprivate let cache = try? Storage(
    diskConfig: DiskConfig(name: "ReadGirl.JSONCache"),
    memoryConfig: MemoryConfig(expiry: .never, countLimit: 10, totalCostLimit: 10),
    transformer: TransformerFactory.forData()
)

您正在将其他实例变量,
diskConfig
memoryConfig
传递给
cache
的初始值设定项,但由于所有属性都是同时初始化的,因此这是不可能的。但是,您可以将
缓存
标记为
惰性
,这意味着只有在第一次访问它时才会对其进行评估。第一次访问只能在封闭实例已经初始化之后发生,因此可以安全地使用
lazy
属性的初始值设定项中的另一个实例变量

let diskConfig = DiskConfig(name: "ReadGirl.JSONCache")
let memoryConfig = MemoryConfig(expiry: .never, countLimit: 10, totalCostLimit: 10)
fileprivate lazy var cache = try? Storage(
    diskConfig: diskConfig,
    memoryConfig: memoryConfig,
    transformer: TransformerFactory.forData()
)
如果您不需要从
cache
变量外部访问
diskConfig
memoryConfig
,另一种可能的解决方案是直接将它们传递到初始值设定项中,而不是将其存储为实例变量

fileprivate let cache = try? Storage(
    diskConfig: DiskConfig(name: "ReadGirl.JSONCache"),
    memoryConfig: MemoryConfig(expiry: .never, countLimit: 10, totalCostLimit: 10),
    transformer: TransformerFactory.forData()
)

谢谢你的解决方案。我尝试了
Lazy
并进入了初始值设定项。我认为,这是有道理的。但是,我还有另外一个错误。首先,我尝试了
Lazy
。它使此消息“无法使用类型为”(diskConfig:diskConfig,memoryConfig:memoryConfig)的参数列表调用类型“Storage”的初始值设定项”,并使初始值设定项生成此消息,“表达式的类型在没有更多上下文的情况下不明确”diskConfig是struct。struct是否有某种类型?@NoriyasuKatano检查我的更新答案,
存储
初始值设定项似乎在GitHub问题创建后已更新。您可能需要根据需要修改
transformer
输入参数的值cache@NoriyasuKatano很高兴我能帮忙。如果您觉得我的答案有用,请在答案旁边用勾号将其标记为已接受的答案。谢谢您的解决方案。我尝试了
Lazy
并进入了初始值设定项。我认为,这是有道理的。但是,我还有另外一个错误。首先,我尝试了
Lazy
。它使此消息“无法使用类型为”(diskConfig:diskConfig,memoryConfig:memoryConfig)的参数列表调用类型“Storage”的初始值设定项”,并使初始值设定项生成此消息,“表达式的类型在没有更多上下文的情况下不明确”diskConfig是struct。struct是否有某种类型?@NoriyasuKatano检查我的更新答案,
存储
初始值设定项似乎在GitHub问题创建后已更新。您可能需要根据需要修改
transformer
输入参数的值cache@NoriyasuKatano很高兴我能帮忙。如果您觉得我的答案有用,请在答案旁边用勾号将其标记为已接受的答案。