gpt4 book ai didi

ios - 无法在 Swift 中跨模块访问属性包装器

转载 作者:行者123 更新时间:2023-11-28 23:24:07 25 4
gpt4 key购买 nike

在我的Common模块(框架项目)中有以下用户默认值的属性包装

@propertyWrapper
public class MyUserDefaultWrapper<T> {
let key: String
let defaultValue: T

public init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}

public var wrappedValue: T {
get {
let suite = UserDefaults(suiteName: "MySuite")
return suite?.object(forKey: key) as? T ?? defaultValue
}
set {
let suite = UserDefaults(suiteName: "MySuite")
suite?.set(newValue, forKey: key)
}
}
}

在我的 App 模块(主项目)中,我声明客户端使用 MyUserDefaultWrapper

import Common

public class MyUserDefaultsCommon: NSObject {
@objc static let shared = MyUserDefaultsCommon()
@MyUserDefaultWrapper("yearOfBirth", defaultValue: 1980)
static var yearOfBirth: Int
}

并使用 like,

MyUserDefaultsCommon.shared.yearOfBirth = 2001

它产生构建错误。

Unknown attribute 'MyUserDefaultWrapper'

如何解决这个问题?

最佳答案

我使用了您的代码,需要进行一些修改才能使其正常工作。我的最终解决方案如下:

@propertyWrapper
public class MyUserDefaultWrapper<T> {
let key: String
let defaultValue: T

public init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}

public var wrappedValue: T {
get {
let suit = UserDefaults.standard
return suit.object(forKey: key) as? T ?? defaultValue
}
set {
let suit = UserDefaults.standard
suit.set(newValue, forKey: key)
}
}
}

主要是缺少一些 public 关键字。但我对您如何实现框架感到困惑,以至于您没有得到正确的错误。

我是如何做到的:

首先创建一个新项目。将 ViewController 修改为:

import UIKit
import PropertyWrapperFramework

class ViewController: UIViewController {

struct MyUserDefaultsCommon{
@MyUserDefaultWrapper("yearOfBirth", defaultValue: 1980)
static var yearOfBirth: Int
}

}

其次 创建一个新的工作区。最好是项目文件所在的位置并且具有相同的名称(不同的扩展名)。关闭所有项目。打开工作区。将项目文件拖到工作区项目导航器中。

第三新建一个项目,选择Framework。选择文件夹时,还要选择底部的“添加到:”以将其插入您的工作区。

第四步 将您的产品包装器拖到“框架、库和嵌入式内容”下的项目中(参见屏幕截图)。您只需捕获“产品”下的“.framework”文件并将其一直向下拖动即可。确保您已选择主项目 -> 目标,如屏幕截图所示。 enter image description here

第五步 将代码添加到您的框架中。创建一个新文件并向其中添加逻辑:

@propertyWrapper
public class MyUserDefaultWrapper<T> {
let key: String
let defaultValue: T

public init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}

public var wrappedValue: T {
get {
let suit = UserDefaults.standard
return suit.object(forKey: key) as? T ?? defaultValue
}
set {
let suit = UserDefaults.standard
suit.set(newValue, forKey: key)
}
}
}

最后构建并运行您的应用。

关于ios - 无法在 Swift 中跨模块访问属性包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com