在目标c和swift

时间:2015-11-28 18:36:16

标签: ios objective-c swift singleton

我有一个在Objective C和Swift类中实现的项目,我需要在这些类之间共享全局变量。 我有两个变量currentUsernamecurrentUsernumber,我需要在项目的每个视图中使用这两个变量,实现它的最佳方法是什么?

我试图实现单例类,这是我的代码:

    class curentUserSingleton {
static var instance: curentUserSingleton!
var currentUsername: String = ""
var currentUsernumber: String = ""

// SHARED INSTANCE
class func sharedInstance(Name : String , Number : String) -> curentUserSingleton {
    self.instance = (self.instance ?? curentUserSingleton(uName: Name , uNumber: Number))
    return self.instance
}

// METHODS
init(uName : String , uNumber : String) {
    self.currentUsername = uName
    self.currentUsernumber = uNumber
}}

但我不知道如何在OC和Swift中安全地使用这个类,我有点困惑,因为我在代码中使用类时会出现声明错误! 这是编写单例类以及如何用两种语言调用它的正确方法吗?

2 个答案:

答案 0 :(得分:1)

我倾向于做类似的事情:

class User: NSObject {
    static let sharedInstance = User()

    var name: String?
    var number: String?
}

然后你可以在Swift中设置和检索namenumber

User.sharedInstance.name = "Foo"
User.sharedInstance.number = "42"

print(User.sharedInstance.name)
print(User.sharedInstance.number)

显然,要从Objective-C .m文件访问它,您必须包含系统生成的标题,如下所示:

#import "ModuleName-Swift.h"    // obviously, replace `ModuleName` with the name of your module

但是,设置和检索这些属性的语法与Swift中的相似:

[User sharedInstance].name = @"Foo";
[User sharedInstance].number = @"42";

NSLog(@"%@", [User sharedInstance].name);
NSLog(@"%@", [User sharedInstance].number);

答案 1 :(得分:0)

对我来说,你似乎根本不需要单身人士。我建议您最好重新设计架构,以便拥有一个可以存储您需要的信息的用户类(如果您将来发现需要,还可以使用更多信息)。

然后,您可以根据需要在视图控制器之间传递该用户对象,也可以更轻松地为app delegate类定义currentUser属性。

这样,每个视图控制器都可以从NSApp全局引用获取应用程序委托给应用程序对象,然后从那里获取当前用户对象。使用此模式,应用程序委托充当您需要的全局可访问单例,而无需自己管理它。