在Xcode中使用swift从子类更改超类中的变量

在Xcode中使用swift从子类更改超类中的变量,xcode,swift,inheritance,subclass,superclass,Xcode,Swift,Inheritance,Subclass,Superclass,我有一个名为Conversion的超类和一堆子类,即Weight。我希望从子类中获取一个字符串类型的数组,并在超类中使用。我可能会离开这里继承遗产;不能从子类转到超类 不过,我还是决定问问,以防万一 class Conversion: UIViewController{ var List = [""] //code that uses variable List } class Weight: Conversion{ var List = ["Milligram", "Gram", "Hect

我有一个名为Conversion的超类和一堆子类,即Weight。我希望从子类中获取一个字符串类型的数组,并在超类中使用。我可能会离开这里继承遗产;不能从子类转到超类

不过,我还是决定问问,以防万一

class Conversion: UIViewController{
var List = [""]
//code that uses variable List
}

class Weight: Conversion{
var List = ["Milligram", "Gram", "Hectogram", "Kilogram", "Ton", "Ounce", "Pound", "Stone"]
//Somehow replace variable List in Conversion superclass 

提前,谢谢您抽出时间。

这里有几件事不对劲。首先,如果您要尝试在这里使用继承,不要将这些类绑定到控制器或MainClass层次结构中,而是使它们独立,然后在控制器中使用它们,或者更好的是,从在单元测试中使用它们开始

至于继承是否适用于这种情况,当然可以。例如,您可以说转换器可以是特定函数的通用或抽象执行者,而特定转换需要不同的实现。例如,货币转换器可能需要查询外部表,而权重转换器只需要数学运算。隐藏实现细节是OO设计的主要目的

然而,从公共基础派生事物或让它们实现公共协议的主要原因是,您可以将不同的事物视为相同的事物。当人们问为什么Java中有接口时,这通常是最好的答案。在Swift中,您有协议。例如,我很想知道为什么权重和货币转换器会从通过公共接口进行操作中受益

此外,要使其真正起作用,您需要泛型。您在这里显示字符串,但这些并不是您想要的。任何度量都将是一个值和一个单位。因此,如果我计算体重,它将是一个数字,然后是一个以磅或公斤为单位的天气指标。您可能希望这些是枚举

最后,如果您希望为相同的操作使用不同的转换器,那么这将是有意义的。例如,有很多方法可以进行货币转换。您可以定义一个协议
CurrencyConverter
,然后拥有该协议的多个实现,这些实现在运行时是可替换的。这里的想法是,您可以让代码通过一个通用协议来操作转换器,并且可以添加不同的实现,而无需更改使用该组件的任何代码。

根据

在适当的情况下,您可以访问 使用
super
前缀的方法、属性或下标:

  • 名为
    someMethod()
    的被重写方法可以通过在重写方法实现中调用
    super.someMethod()
    来调用
    someMethod()
    的超类版本

  • 名为
    someProperty
    的被重写属性可以在重写getter或setter实现中以
    super.someProperty
    的形式访问someProperty的超类版本

  • someIndex
    的重写下标可以从重写下标实现中访问与
    super[someIndex]
    相同下标的超类版本

如果需要,应该在子类属性前面加上
override
,以获得此功能

请注意,通常不需要这样做,只需从超类继承属性并在自己的
init()
中对其进行初始化即可:

更好的方法可能是使用协议:

protocol Conversion {
  static var list:[String] { get }
}

class Weight: Conversion {
  static let list = ["Milligram", "Gram", "Hectogram", "Kilogram", "Ton", "Ounce", "Pound", "Stone"]
}

为什么还要在子类中重新声明变量?你可以在init函数中设置继承的版本。你能给我举个例子吗?我用init()尝试了各种不同的方法,但没有成功。在子类中:
init(){List=[“毫克”、“克”、“百克”、“千克”、“吨”、“盎司”、“磅”、“石”]}
。不要执行
var List=…
,因为这是在不同的范围内声明另一个变量。
protocol Conversion {
  static var list:[String] { get }
}

class Weight: Conversion {
  static let list = ["Milligram", "Gram", "Hectogram", "Kilogram", "Ton", "Ounce", "Pound", "Stone"]
}