ios - 如何在不同的类中使用公共(public)代码

标签 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 类的所有数据。

最佳答案

问题是你不够“敏捷”

使用协议(protocol)来设置您期望的界面。 使用结构对数据进行分组。

以下是您可以采用的一种方法。 仅供引用,您不需要计算变量,因为您没有计算任何特殊的东西。另外你真的不需要 protocol:init 因为为什么会膨胀?

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

关于ios - 如何在不同的类中使用公共(public)代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847523/

相关文章:

ios - cocoa pod 的问题

java - 在构造方法引用中,使用泛型类型参数和不使用泛型类型参数的区别?

c# - foreach 和泛型编译器问题

generics - 为什么在mockito 2中使用 "doAnswer"时getArgument()不会隐式转换?

c# - Xamarin Forms IOS - MKUserTrackingButton 位置

ios - UIBezierPath 和 CAShapeLayer

ios - 无法在设备上运行单元测试 - 代码覆盖数据生成失败 (IOS)

iphone - 如何在 Swift 中以编程方式将联系人设置为最喜欢的联系人?

ios - CGContextRef 无法与 @IBDesignable 一起使用(错误 :The agent Crashed)

swift - CoreMIDI 目标的困惑