我正在为我的项目使用一些自动生成的代码。 在这些文件中,一些创建的结构字面上完全相同,但名称不同。举个简单的例子,假设他们看起来像这样:
struct FromPlace:CoreClass{
let id:String
let name:String
}
struct ToPlace:CoreClass{
let id:String
let name:String
}
是的,我知道,应该只存在一个 struct Place:CoreClass
。我在这个问题上没有任何选择,因为这段代码是在很远的地方自动生成的。只是幽默我弄清楚这个,对吗?:)
CoreClass
是他们共同的东西,但与此无关。
我也无法更改文件。它被锁定了。不,我不想解锁它。
假设我有自己的班级,名为AwesomePlace
。我想用其他任何地方初始化我真棒的地方,比如:
class AwesomePlace{
init(place:FromPlaceOrToPlace){
//Be able to write place.id or place.name here pls
}
}
我希望能够将FromPlace或ToPlace的实例发送到此init,这样可以保留访问其正确变量的可能性。而且由于其他代码是自动生成的,我需要根据结构中的变量自动生成,不需要手动中间人。
我以为我可以这样做:
protocol FromPlaceOrToPlace {}
extension FromPlace:FromPlaceOrToPlace{}
extension ToPlace:FromPlaceOrToPlace{}
但是在这样做时,我失去了访问FromPlaceOrToPlace
中任何变量的能力,因为它没有任何变量。要“修复”这个,我可以在协议中插入公共变量,但我不想这样做。我这里不能做任何手工工作。这些自动生成的代码可能会经常发生变化。
我可以举例来说,以某种方式创建继承自 FromPlace
的协议,然后创建继承此内容的ToPlace
的扩展名吗?如果可能的话,使用其中一个作为共同“协议”(或其他)的“基础”是可以的。
答案 0 :(得分:2)
在Swift中你可以使用两个指定的初始化器
class AwesomePlace{
init(place:FromPlace){
// write place.id or place.name here
}
init(place:ToPlace){
// write place.id or place.name here
}
}
当你像这样实例化时,
let myPlace = AwesomePlace(place:somePlace)
只会调用相关的初始化程序。
答案 1 :(得分:1)
要使用/en/:username
参数在FromPlace
内打印ToPlace
和init
个变量,您应该能够检查FromPlaceOrToPlace
的类型,把它展开并打开它就像这样:
FromPlaceOrToPlace