可以在不使用共享协议变量的情况下以平等方式访问不同(尽管相同)的结构吗?

时间:2018-04-15 16:31:15

标签: ios

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

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的扩展名吗?如果可能的话,使用其中一个作为共同“协议”(或其他)的“基础”是可以的。

2 个答案:

答案 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内打印ToPlaceinit个变量,您应该能够检查FromPlaceOrToPlace的类型,把它展开并打开它就像这样:

FromPlaceOrToPlace