如何在不同的类中使用通用代码

时间:2019-04-25 10:47:08

标签: ios swift generics

我有一些在某些类中需要使用的函数和变量。并且在每个类中编写相同的函数,变量及其定义很麻烦。

就像我有一些变量和函数一样

@objc public class ResponseBase {
private var _messageType = ""
private var _name = ""

@objc public var name: String {
    get { return _name }
    set { _name = newValue }
}

@objc public var messageType: String {
    get { return _messageType }
    set { _messageType = newValue }
}

class func initWithDictionary(_ dictionary: [AnyHashable : Any]) -> ResponseBase {
 if let messageType = dictionary["messageType"] as? String {
        ret.messageType = messageType
    }

    if let name = dictionary["Name"] as? String {
        ret.name = name
    }
}

}

现在我有一些类似的课程

class messages {
}

class chat {
}

class videoData {
}

现在我应该如何在这些类中使用ResponseBase函数和变量。

我尝试使用

class messages: ResponseBase {
}

通过这样使用,我可以访问功能 但是,当我从 messages 类调用** initWithDictionary **方法时,则需要带有ResponseBase类的所有数据的message类的对象。

2 个答案:

答案 0 :(得分:1)

问题是你不是很“聪明”

使用协议设置所需的界面。 使用结构将数据分组。

以下是您可以采用的一种方法。 仅供参考,因为您不需要进行任何特殊的计算,所以不需要计算出的变量。另外,您真的不需要protocol:init,因为为什么会at肿?

import Foundation

struct ResponseData {
    var messageType: String = ""
    var name: String = ""
}

protocol Response {
    var data: ResponseData {get set}
}

extension Response {
    var name: String {
        get { return data.name }
        set { data.name = newValue }
    }

    var messageType: String {
        get { return data.messageType }
        set { data.messageType = newValue }
    }

    mutating func initWithDictionary(_ dictionary: [AnyHashable : Any]) -> Response {
        if let msgType = dictionary["messageType"] as? String {
            data.messageType = msgType
        }

        if let n = dictionary["Name"] as? String {
            data.name = n
        }

        return self
    }
}

class Messages: Response {
    var data: ResponseData = ResponseData()
}

//example usage:
Messages().name
Messages().messageType

答案 1 :(得分:0)

首先,他们不是您的问题的唯一答案。如何在不同的类中使用通用代码,因为使用通用代码会随所需的要求和体系结构而变化。

与您的情况类似,当您需要使用某些常用功能时,不要与它一起使用class关键字,并且在messages类中使用它时,只需重写initWithDictionary方法,如下所示

@objc public class ResponseBase {
 var _messageType = ""
 var _name = ""

@objc public var name: String {
    get { return _name }
    set { _name = newValue }
}

@objc public var messageType: String {
    get { return _messageType }
    set { _messageType = newValue }
}

 func initWithDictionary(_ dictionary: [AnyHashable : Any]) -> ResponseBase {
 if let messageType = dictionary["messageType"] as? String {
        ret.messageType = messageType
    }

    if let name = dictionary["Name"] as? String {
        ret.name = name
    }
}

}

class messages: ResponseBase {
override func initWithDictionary(_ dictionary: [AnyHashable : Any]) -> ResponseBase {
super.initWithDictionary(dictionary)
print(self.name) // or  print(self._name)
}
}