【问题标题】:Setters and Getters with Generics Swift使用泛型 Swift 的 Setter 和 Getter
【发布时间】:2020-03-20 03:02:49
【问题描述】:

我想知道是否有办法用泛型更好地做到这一点。我有这个单例,每个对象都需要一个 setter 和另一个 getter。另外,我必须检查每个 getter 中的属性是否为零,这是很多重复的代码。例如:

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
    }
}

我想知道是否所有这些逻辑都可以在一个方法中完成,也许使用泛型?

【问题讨论】:

  • 开始声明你的数组是非可选的,并用一个空集合[ ]初始化它们。顺便说一句,从您的属性和类型中删除 Data 和 Model 关键字,并且不要继承 NSObject
  • class Manager { var posts: [Post] = [] var users: [User] = [] var comments: [Comment] = [] var photos: [Photo] = [] var albums: [Album] = [] ... 等等

标签: ios swift generics swift3


【解决方案1】:

如果您想将所有对象强制为set 作为none optional 并且还将get 作为none optional,您不需要首先将它们定义为可选:

所以而不是:

private var postData : [PostModel]?

你应该有:

private var postData = [PostModel]()

这将为您提供一个空的 none optional 数组,并且无法将其设置或获取为 optional


如果您希望他们在某人get 他们之前成为nil(用于内存管理等),您可以将他们设为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]()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多