我正在为项目使用一些自动生成的代码。
在这些文件中,尽管名称不同,但某些创建的结构在字面上是相同的。举一个简单的例子,假设它们看起来像这样:

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/

10-12 00:27
查看更多