Ios 无法在Swift中跨模块访问属性包装
在myIos 无法在Swift中跨模块访问属性包装,ios,swift,module,build-error,property-wrapper,Ios,Swift,Module,Build Error,Property Wrapper,在myCommon模块(框架项目)中,在用户默认值的属性包装器下方有 @propertyWrapper public class MyUserDefaultWrapper<T> { let key: String let defaultValue: T public init(_ key: String, defaultValue: T) { self.key = key self.defaultValue = default
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)
}
}
}
并使用like,
MyUserDefaultsCommon.shared.yearOfBirth = 2001
它产生了构建错误
未知属性“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)
}
}
}
第二步创建一个新的工作区。最好是项目文件是相同名称(不同扩展名)的文件。关闭所有项目。打开工作区。将项目文件拖到工作区项目导航器中
第三个创建一个新项目并选择框架。选择文件夹时,也可选择底部的“添加到:”将其插入工作区
Fourth将产品包装拖到“框架、库和嵌入内容”下的项目中(参见屏幕截图)。您只需抓取“产品”下的“.framework”文件并将其一直向下拖动即可。确保您已选择屏幕截图所示的主项目->目标。
Fifth向框架中添加代码。创建新文件并向其添加逻辑:
@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)
}
}
}
@propertyWrapper
公共类MyUserDefaultWrapper{
让键:字符串
设默认值:T
public init(ukey:String,defaultValue:T){
self.key=key
self.defaultValue=defaultValue
}
公共var wrappedValue:T{
得到{
让suit=UserDefaults.standard
返回suit.object(forKey:key)作为?T??默认值
}
设置{
让suit=UserDefaults.standard
套装(newValue,forKey:key)
}
}
}
最后构建并运行你的应用程序。你确实导入了项目,对吗?是的,我已经导入了桥接头和文件顶部的#导入关键字并没有解决我的问题。我已经正确链接了框架,因为其他公共API可以访问,没有任何问题。@SazzadHissainKhan不幸的是,如果没有额外的信息,这可能无法解决。我使用了您发布的所有代码,并设法在我的应用程序中运行它。也许您的框架需要显式地重建?很抱歉,我以前的帖子中出现了错误的代码片段。请尝试在我的原始帖子中更新新的代码段。你能试着让它现在可以构建吗?@SazzadHissainKhan你没有收到任何错误吗?对
suit
的两个调用报告一个错误,因为suit
不是可选的。它应该是suit.
而不是suit?
在两种情况下。我已经更新了代码。我试图在没有产品代码的情况下添加最小的示例。谢谢你指出。请参见我现在使用let suite=UserDefaults(suiteName:“MySuite”)
。
import UIKit
import PropertyWrapperFramework
class ViewController: UIViewController {
struct MyUserDefaultsCommon{
@MyUserDefaultWrapper("yearOfBirth", defaultValue: 1980)
static var yearOfBirth: Int
}
}
@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)
}
}
}