以下代码:
class City {
var cityId : String?
var cityName : String?
}
class Town {
var townid : String?
var townName : String?
}
class Address : City , Town {
var house : String?
var street: String?
}
生成编译时错误:
Address.swift:38:24:来自班级“城市”和“城镇”的多重继承
我该如何解决他的问题?有什么方法可以遵循?
答案 0 :(得分:4)
备注:如果您不确定该继承是您的正确选择,我建议您检查Sulthan's answer。
但是,正如您所提到的,Swift 不支持多重继承。你应该做的是让Address
类采用协议;您还可以添加协议扩展:
您可以扩展现有类型以采用并符合新的类型 协议,即使您无权访问该源代码 现有类型。扩展可以添加新的属性,方法和 下标到现有类型,因此可以添加任何类型 协议可能要求的要求。
表示您可以对协议方法/属性实现默认值/行为。
参考您的示例,它应该类似于:
protocol City { }
extension City {
var cityId: String {
return "Default City ID"
}
var cityName: String {
return "Default City Name"
}
// adding method:
func doSomething() {
print("Do Something!!")
}
}
protocol Town { }
extension Town {
var townid: String {
return "Default Town ID"
}
var townName: String {
return "Default Town Name"
}
}
class Address:City, Town {}
输出:
let address = Address()
print(address.cityId) // Defaut City ID
print(address.cityName) // Defaut City Name
print(address.townid) // Default Town ID
print(address.townName) // Default Town Name
address.doSomething() // Do Something!!
另外,如果你想为方法添加一些额外的工作(类似于super.doSomething()
),你可以这样做:
class Address:City, Town {
func doSomething() {
(self as City).doSomething()
print("Addtional Job!!")
}
}
输出:
let address2 = Address()
address2.doSomething()
// Do Something!!
// Addtional Job!!
进一步:
有关详细信息,请查看Protocols和Extensions文档。
另外,您可能需要观看Protocol-Oriented Programming in Swift Apple Session。
答案 1 :(得分:4)
看来你正在过度思考。而不是继承,尝试使用更多的组合。地址不应继承自City
。为什么?因为逻辑上地址不是一种城市。相反,城市定义是地址的一部分:
class Address {
var city: City?
var town: Town?
var house : String?
var street: String?
}