我有一个在Objective C和Swift类中实现的项目,我需要在这些类之间共享全局变量。
我有两个变量currentUsername
和currentUsernumber
,我需要在项目的每个视图中使用这两个变量,实现它的最佳方法是什么?
我试图实现单例类,这是我的代码:
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中安全地使用这个类,我有点困惑,因为我在代码中使用类时会出现声明错误! 这是编写单例类以及如何用两种语言调用它的正确方法吗?
答案 0 :(得分:1)
我倾向于做类似的事情:
class User: NSObject {
static let sharedInstance = User()
var name: String?
var number: String?
}
然后你可以在Swift中设置和检索name
和number
:
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全局引用获取应用程序委托给应用程序对象,然后从那里获取当前用户对象。使用此模式,应用程序委托充当您需要的全局可访问单例,而无需自己管理它。