我有一些在某些类中需要使用的函数和变量。并且在每个类中编写相同的函数,变量及其定义很麻烦。
就像我有一些变量和函数一样
@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类的对象。
答案 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)
}
}