【发布时间】:2019-10-24 00:00:55
【问题描述】:
我正在开发一个应用程序,它使用单例模式来存储单会话用户状态数据。它使用需要访问相同数据的框架,但当前框架仅在尝试访问类属性时才找到nil。这是我目前的设置方式。
在框架内:
open class UserStateBase {
var locationManager : LocationManagerDelegate!
var currentUser : String?
var currentPass : String?
// ... a dozen other properties
}
public var UserState : UserStateBase!
在应用中:
import Framework
class UserStateClass : UserStateBase {
var locationManager = LocationManager()
var currentUser : String?
var currentPass : String?
// ... many more properties
}
var UserState = UserStateClass()
在应用程序的AppDelegate 类中:
func application(...) {
// Override point for customisation after application launch
Framework.UserState = App_Module.UserState
}
在整个框架和应用程序中,我调用UserState.username 来访问属性。
我知道通过值而不是通过引用传递会起作用,但由于属性的数量以及在应用程序中发生更改时需要更新它们,它会更加乏味。
我最初尝试将UserStateBase 设为协议,但这不起作用,因为它包含几个属性,这些属性被定义为实现类的协议,并且编译器抱怨它需要在其中声明实现同样的方式(例如,协议中的locationManager 需要实现将其声明为var locationManager : LocationManagerDelegate = LocationManager(),这意味着每次我想访问不在LocationManagerDelegate 协议中的函数时,我都必须转换为LocationManager)。
这就是为什么 currentUser 和 currentPass 被声明两次的原因 - 我的意图是让子类覆盖基类,我认为这是正在发生的事情,因为编译器没有抱怨不明确的引用。
这种模式在修改后是否有效,还是我需要将所有 UserState 值单独传递给框架?
【问题讨论】:
标签: ios swift ios-frameworks