带有通用Swift的Setter和Getters

问题描述 投票:-1回答:1

我想知道是否有一种方法可以更好地使用泛型。我有这个单例,每个对象都需要一个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
    }
}

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

ios swift generics swift3
1个回答
4
投票

如果要强制将所有对象作为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]() }


0
投票
首先,您所拥有的getter和setter方法是错误的。让我们以其中之一为例。你有这个:

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 }

© www.soinside.com 2019 - 2024. All rights reserved.