这个回答并不是针对OP的,只是因为他说“我倾向于仅在我的类定义中放置必需品(存储属性、初始化程序),并将其他所有内容移动到它们自己的扩展中...”而感到受到启发而作出回应。我主要是一名C#程序员,在C#中可以使用部分类来实现这个目的。例如,Visual Studio使用部分类将与UI相关的内容放在单独的源文件中,并使您的主源文件保持整洁,以免分心。
如果您搜索“swift partial class”,您会找到各种链接,Swift支持者说Swift不需要部分类,因为您可以使用扩展。有趣的是,如果您在Google搜索字段中键入“swift extension”,它的第一个搜索建议是“swift extension override”,目前这个Stack Overflow问题是第一个命中的。我认为这意味着与Swift扩展相关的(缺乏)覆盖功能问题是最受关注的主题,并强调了Swift扩展无法取代部分类,至少如果您在编程中使用派生类。
总之,为了简化冗长的介绍,我在一个情况下遇到了这个问题,即我想将一些样板/包袱方法移出Swift类的主要源文件,这些类是我的C#-to-Swift程序生成的。在将它们移动到扩展后遇到了无法覆盖这些方法的问题之后,我最终实现了以下简单的解决方法。主要的Swift源文件仍然包含一些小的存根方法,调用扩展文件中的真实方法,并且这些扩展方法被赋予唯一的名称以避免覆盖问题。
public protocol PCopierSerializable {
static func getFieldTable(mCopier : MCopier) -> FieldTable
static func createObject(initTable : [Int : Any?]) -> Any
func doSerialization(mCopier : MCopier)
}
.
public class SimpleClass : PCopierSerializable {
public var aMember : Int32
public init(
aMember : Int32
) {
self.aMember = aMember
}
public class func getFieldTable(mCopier : MCopier) -> FieldTable {
return getFieldTable_SimpleClass(mCopier: mCopier)
}
public class func createObject(initTable : [Int : Any?]) -> Any {
return createObject_SimpleClass(initTable: initTable)
}
public func doSerialization(mCopier : MCopier) {
doSerialization_SimpleClass(mCopier: mCopier)
}
}
.
extension SimpleClass {
class func getFieldTable_SimpleClass(mCopier : MCopier) -> FieldTable {
var fieldTable : FieldTable = [ : ]
fieldTable[376442881] = { () in try mCopier.getInt32A() }
return fieldTable
}
class func createObject_SimpleClass(initTable : [Int : Any?]) -> Any {
return SimpleClass(
aMember: initTable[376442881] as! Int32
)
}
func doSerialization_SimpleClass(mCopier : MCopier) {
mCopier.writeBinaryObjectHeader(367620, 1)
mCopier.serializeProperty(376442881, .eInt32, { () in mCopier.putInt32(aMember) } )
}
}
.
public class DerivedClass : SimpleClass {
public var aNewMember : Int32
public init(
aNewMember : Int32,
aMember : Int32
) {
self.aNewMember = aNewMember
super.init(
aMember: aMember
)
}
public class override func getFieldTable(mCopier : MCopier) -> FieldTable {
return getFieldTable_DerivedClass(mCopier: mCopier)
}
public class override func createObject(initTable : [Int : Any?]) -> Any {
return createObject_DerivedClass(initTable: initTable)
}
public override func doSerialization(mCopier : MCopier) {
doSerialization_DerivedClass(mCopier: mCopier)
}
}
.
extension DerivedClass {
class func getFieldTable_DerivedClass(mCopier : MCopier) -> FieldTable {
var fieldTable : FieldTable = [ : ]
fieldTable[376443905] = { () in try mCopier.getInt32A() }
fieldTable[376442881] = { () in try mCopier.getInt32A() }
return fieldTable
}
class func createObject_DerivedClass(initTable : [Int : Any?]) -> Any {
return DerivedClass(
aNewMember: initTable[376443905] as! Int32,
aMember: initTable[376442881] as! Int32
)
}
func doSerialization_DerivedClass(mCopier : MCopier) {
mCopier.writeBinaryObjectHeader(367621, 2)
mCopier.serializeProperty(376443905, .eInt32, { () in mCopier.putInt32(aNewMember) } )
mCopier.serializeProperty(376442881, .eInt32, { () in mCopier.putInt32(aMember) } )
}
}
正如我在介绍中所说的,这并没有真正回答OP的问题,但我希望这个简单的解决方法对那些希望将方法从主源文件移动到扩展文件并遇到无法覆盖的问题的其他人有所帮助。