我想知道是否有一种方法可以更好地使用泛型。我有这个单例,每个对象都需要一个setter和另一个getter。另外,我必须检查每个getter中的属性是否为nil,这是很多重复的代码。例如:
class DataManager : NSObject {
private override init(){}
private var postData : [PostModel]?
private var userData : [UserModel]?
private var commentsData : [CommentsModel]?
private var photosData : [PhotosModel]?
private var albumsData : [AlbumsModel]?
private var todosData : [TodosModel]?
static let shared = DataManager()
//MARK : Setters
func setUserData(data : [UserModel]) {
self.userData = data
}
func setPostData(data : [PostModel]) {
self.postData = data
}
func setCommentsData(data : [CommentsModel]) {
self.commentsData = data
}
func setAlbumsData(data : [AlbumsModel]) {
self.albumsData = data
}
func setPhotosData(data : [PhotosModel]) {
self.photosData = data
}
func setTodosData(data : [TodosModel]) {
self.todosData = data
}
//MARK : Getters
func getUserData() -> [UserModel]? {
if self.userData != nil {
return self.userData!
}
return nil
}
func getPostData() -> [PostModel]? {
if self.postData != nil {
return self.postData!
}
return nil
}
func getCommentsData() -> [CommentsModel]? {
if self.commentsData != nil {
return self.commentsData!
}
return nil
}
func getAlbumsData() -> [AlbumsModel]? {
if self.albumsData != nil {
return self.albumsData!
}
return nil
}
func getPhotosData() -> [PhotosModel]? {
if self.photosData != nil {
return self.photosData!
}
return nil
}
func getTodosData() -> [TodosModel]? {
if self.todosData != nil {
return self.todosData!
}
return nil
}
}
我想知道是否所有这些逻辑都可以用一种方法完成,也许可以使用泛型?
如果要强制将所有对象作为set
强制为none optional
,并且也将get
强制为none optional
,则无需首先将它们定义为可选:
所以代替:
private var postData : [PostModel]?
您应该拥有:
private var postData = [PostModel]()
这将为您提供一个空的none optional
数组,无法将其设置为或作为optional
。
如果要在某人nil
之前将它们设为get
(用于内存管理等),则可以将其设置为lazy
:
private lazy var postData = [PostModel]()
所以现在postData
将是nil
,直到有人尝试读取它的值为止。
如果有人尝试set
其中之一时需要做一些额外的工作,则可以观察值的[[设置前和设置后的变化:
private var postData = [PostModel]() {
willSet { /* right before the value is going to set */ }
didSet { /* right after the value is set */ }
}
请注意,惰性属性不能具有观察者
所以您似乎根本没有任何功能。您可以将代码重构为如下形式:
class DataManager : NSObject { private override init(){} lazy var postData = [PostModel]() lazy var userData = [UserModel]() lazy var commentsData = [CommentsModel]() lazy var photosData = [PhotosModel]() lazy var albumsData = [AlbumsModel]() lazy var todosData = [TodosModel]() }
private var userData : [UserModel]?
func setUserData(data : [UserModel]) {
self.userData = data
}
func getUserData() -> [UserModel]? {
if self.userData != nil {
return self.userData!
}
return nil
}
您的吸气剂getUserData
是毫无意义的,因为它可以返回nil
。但是,如果此属性是公共属性,并且吸气剂不存在,那将是会发生的事情!这样就给我们留下了这个:
private(set) var userData : [UserModel]? func setUserData(data : [UserModel]) { self.userData = data }