无法跨 Swift 中的模块访问 属性 包装器
Cannot access property wrapper across modules in Swift
在我的 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
}
}
其次创建一个新的工作区。最好是项目文件所在的位置并且具有相同的名称(不同的扩展名)。关闭所有项目。打开工作区。将项目文件拖到工作区项目导航器中。
第三步 创建一个新项目和select Framework。当 selecting 文件夹也在底部 select "Add to:" 将其插入您的工作区时。
Fourth 将您的产品包装器拖到 "Framework, Libraries, and Embedded Content" 下的项目中(见屏幕截图)。您只需抓住 "Products" 下的“.framework”文件并将其一直向下拖动。确保您已 select 编辑主项目 -> 目标,如屏幕截图所示。
第五步 将代码添加到您的框架中。创建一个新文件并向其中添加逻辑:
@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)
}
}
}
最后 构建并运行 您的应用。
在我的 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
}
}
其次创建一个新的工作区。最好是项目文件所在的位置并且具有相同的名称(不同的扩展名)。关闭所有项目。打开工作区。将项目文件拖到工作区项目导航器中。
第三步 创建一个新项目和select Framework。当 selecting 文件夹也在底部 select "Add to:" 将其插入您的工作区时。
Fourth 将您的产品包装器拖到 "Framework, Libraries, and Embedded Content" 下的项目中(见屏幕截图)。您只需抓住 "Products" 下的“.framework”文件并将其一直向下拖动。确保您已 select 编辑主项目 -> 目标,如屏幕截图所示。
第五步 将代码添加到您的框架中。创建一个新文件并向其中添加逻辑:
@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)
}
}
}
最后 构建并运行 您的应用。