Ios 无法在Swift中跨模块访问属性包装

Ios 无法在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

在my
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)
        }
    }
}