【问题标题】:Swift Inheritance(Extending classes)Swift 继承(扩展类)
【发布时间】:2020-12-10 09:09:32
【问题描述】:

我有两个类 ClassA、ClassB、ClassC 和 ClassC 是从 ClassA 扩展而来的

open class classA: NSObject{
    var firstName = String()
    var lastName = String()
}
open class classB: NSObject{
    public func getObject(dictionary : Dictionary<String,Any>) -> Dictionary<String,Any>{
       var Dict : [String: Any] = [:]
       var ListArray = Array<Any>()
       let tempArray = dictionary["data"] as! Array<Any>
    
    for item in 0..<tempArray.count{
        let dict = tempArray[item] as! NSMutableDictionary
        let myclass = classA()
       
        if let val = dict["firstName"] as? String{
            myclass.firstName = val
        }else if let val =  dict["lastName"] as? String{
            myclass.lastName = val
        }
        ListArray.append(myclass)
    }
    Dict["data"] = ListArray
    
    return Dict
}

}

如果我像这样扩展 ClassC

public ClassC : ClassA{
   var age = String()
   var address = String()

}

有没有办法在 B 类函数 getObjects 中使用这个 ClassC 变量? 我无法将 ClassC 变量移动到 ClassA。 任何人都可以帮助我实现这一目标。

提前致谢。

【问题讨论】:

  • 为什么B不能从A扩展?否则,这看起来很快就会成为一个工厂类,可能被 C(和其他)独立使用
  • @MadProgrammer 感谢您的评论,您能否解释一下,我是编程新手。
  • 如果你想让C同时拥有A和B的功能,那么B必须继承A,那么C就会继承A和B的功能。另一方面,如果你想要B 更通用并用于更多用例,然后 B 将成为“工厂”类,C 将在内部创建一个实例并使用

标签: ios swift iphone


【解决方案1】:

您可以将类型用作值并将其作为参数传递:

class ClassB {
    func someFunc(A: ClassA.Type) {
        let classA = A.init(f: "firstName", l: "lastName")
        print(classA)
    }
}

你必须像这样传递类型:

let b = ClassB()
b.someFunc(A: ClassA.self)

Swift 的多态性适用于此,这意味着即使您通过ClassC,也将被允许:

let b = ClassB()
b.someFunc(A: ClassC.self)

您必须为子类提供所需的初始化程序:

open class ClassA: NSObject{
    var firstName: String?
    var lastName: String?
    required public init(f: String = "", l: String = "") {
        self.firstName = f
        self.lastName = l
    }
}

class ClassC : ClassA {
    var age = String()
    var address = String()
}

【讨论】:

  • 感谢您重播它的工作正常,但是,这个 classA 是我实时拍摄的一般示例,我的班级有超过 70 个变量声明。这是公共初始化方法所必需的吗?有没有办法一次初始化所有变量
  • 当然,初始化器就像常规函数。您在其中包含更多参数以初始化更多变量。但是,您不能初始化子类的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
相关资源
最近更新 更多