简体   繁体   中英

Setters and Getters with Generics Swift

I was wondering if there is a way to do this in a better way with generics. I have this singleton which needs a setter and another getter for every object. Plus, I have to check that the property is not nil in every getter, which is a lot of repeated code. ex:

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

I was wondering if all this logic could be done in one single method, maybe using generics?

If you want to force all object to set as a none optional and also get as a none optional , you don't need to define them as optional at the first place:

So instead of:

private var postData : [PostModel]?

you should have:

private var postData = [PostModel]()

This will gives you an empty none optional array and it can not be set or get as an optional .


If you want them to be nil before someone get them (for memory management or etc.), You can make them lazy :

private lazy var postData = [PostModel]()

So now postData will be nil until someone tries to read the value of it.


If you need to do some extra job when someone tries to set one of these, you can observe for changes before set and after set of the value:

private var postData = [PostModel]() {
    willSet { /* right before the value is going to set */ }
    didSet { /* right after the value is set */ } 
}

Note that lazy properties can not have observers


So seems like you don't have any of the functions at all. And you can refactor your code to something like this:

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]()
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM