这个答案不是针对OP,而是令我感到鼓舞的是他的回答:“我倾向于只将必需品(存储的属性,初始值设定项)放入我的类定义中,并将其他所有内容移入它们自己的扩展中。” ..”。我主要是C#程序员,在C#中,可以为此使用部分类。例如,Visual Studio使用局部类将与UI相关的内容放置在单独的源文件中,并使主源文件保持整洁,以免分散您的注意力。
如果搜索“ swift局部类”,您会找到各种链接,其中Swift信徒说Swift不需要局部类,因为您可以使用扩展。有趣的是,如果您在Google搜索字段中输入“ swift extension”,则其第一个搜索建议是“ swift extension Override”,此刻,此“堆栈溢出”问题是第一个匹配项。我的意思是,(缺乏)覆盖功能的问题是与Swift扩展相关的搜索量最大的话题,并强调了一个事实,即至少在您使用派生类的情况下,Swift扩展可能无法替换部分类。编程。
无论如何,为了简化冗长的介绍,我遇到了这个问题,我想将一些样板/行李方法从我的C#-to-Swift程序生成的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() } // aMember
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() } // aNewMember
fieldTable[376442881] = { () in try mCopier.getInt32A() } // aMember
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的问题,但是我希望这种简单的解决方法对希望将方法从主源文件移至扩展文件并遇到no的其他人有所帮助。 -覆盖问题。