如何从 Swift 类中检索目标 C 类中的 Userdefault?

Posted

技术标签:

【中文标题】如何从 Swift 类中检索目标 C 类中的 Userdefault?【英文标题】:How to retrieve Userdefault in objectiveC class from Swift class? 【发布时间】:2018-08-01 07:32:18 【问题描述】:

我在 swift 类中保存了 userdefault 字符串值,以及如何在 Objective C 类中检索该值?我使用了https://***.com/questions/44171504/userdefaults-between-objective-c-and-swift,它可以从 Objc 到 swift,但反之则不行。

示例代码

保存在 ObjC 类中

[[NSUserDefaults standardUserDefaults] setObject:@"HELLO" forKey:@"kcString"];

使用 Swift 类检索

if let str = UserDefaults.standard.string(forKey: "kcString") 
    print("Found kcString \(str)")
 else 
    print("No string for key kcString")

但不能以相反的方式工作。

保存在 swift 类中使用:

UserDefaults.standard.set("hello", forKey: "kcString")

尝试在 objc 类中检索:

self.val = [[NSUserDefaults standardUserDefaults] stringForKey:@"kcString"];

【问题讨论】:

“不工作”是什么意思?您能否提供“反之亦然”的代码? 显示反之亦然的代码 【参考方案1】:

由于用户默认值与您的应用程序相关联,而不是与任何文件相关联。您可以使用任何类型的文件访问用户默认值,无论是在 swift 中还是在目标 c 中。我假设您正在处理单个目标。请遵循这个概念。

我做了一个快速的项目。 我添加了一个目标 c 文件。 我还添加了桥接头文件。 现在我将访问用户默认值:

在.h文件中描述两种方法:

@interface UDF_Objc_Access : NSObject

    +(void)set_udf_value_objc:(NSString *)value for:(NSString*)key;
    +(NSString *)get_udf_swift_value_for:(NSString*)key;

@end

在 .m 实现文件中给出如下定义:

@implementation UDF_Objc_Access

+(void)set_udf_value_objc:(NSString *)value for:(NSString *)key 
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];


+(NSString *)get_udf_swift_value_for:(NSString *)key 
    return [[NSUserDefaults standardUserDefaults] stringForKey:key];


@end

现在在你的 Appdelegate.swift 中做:

     /*
     key names
     swift key = "swift_key"
     objective c key = "objc_key"
     */
    let swift_key = "swift_key"
    let objc_key = "objc_key"


    //MARK:- Case 1
    /*
     Save value from swift file & get it from objective c file
     */

    UserDefaults.standard.set("This value is saved from swift class", forKey: swift_key)
    UserDefaults.standard.synchronize()

    //getting value from objective c class
    print(UDF_Objc_Access.get_udf_swift_value_(for: swift_key))

    /*
     Set value from objective c file & get it with swift
     */
    UDF_Objc_Access.set_udf_value_objc("This value is saved from objective c file", for: objc_key)

    //print value form swift
    print(UserDefaults.standard.value(forKey: objc_key)!)

注意:如果您使用多个目标,请使用应用组。

【讨论】:

是的,你是对的,谢谢。它不适用于同一个键。 不要使用.synchronize()。来自Apple's documentation“这个方法是不必要的,不应该使用。”

以上是关于如何从 Swift 类中检索目标 C 类中的 Userdefault?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用通知将字符串数据从 swift 传递到目标 c 类

如何在目标 c 数据模型类中使用 Codable 协议?

在目标 C 中引用另一个类中的实例化对象

如何从不同的swift文件访问一个类中的所有对象

如何从同一类中的另一个方法检索最后插入的 id?

在全局数据类中存储和检索数据