我正在为项目使用一些自动生成的代码。
在这些文件中,尽管名称不同,但某些创建的结构在字面上是相同的。举一个简单的例子,假设它们看起来像这样:
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
中的任何变量的能力,因为它没有任何变量。为了“解决”这个问题,我可以在协议中插入 public 变量,但是我不想这样做。我在这里没有任何手工工作。这些自动生成的代码可能会经常更改。你知道我要去哪里吗?这样的事情是否可能实现,而无需像通常那样填充协议中的 public 变量?
例如,我可以以某种方式创建一个从
FromPlace
继承的协议,然后为ToPlace
创建一个继承此协议的扩展吗?如果可能的话,可以将其中之一用作通用“协议”(或其他协议)的“基础”。 最佳答案
在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)
只有相关的初始化程序将被调用。关于ios - 没有共享协议(protocol)变量,是否可以平等地访问不同(尽管相同)的结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49844264/