Ios 在没有共享协议变量的情况下,不同(尽管相同)的结构是否可以被平等地访问?

Ios 在没有共享协议变量的情况下,不同(尽管相同)的结构是否可以被平等地访问?,ios,Ios,我正在为我的项目使用一些自动生成的代码。 在这些文件中,一些创建的结构实际上是相同的,尽管名称不同。举个简单的例子,假设它们看起来像这样: struct FromPlace:CoreClass{ let id:String let name:String } struct ToPlace:CoreClass{ let id:String let name:String } class AwesomePlace{ init(place:FromPlaceO

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

struct FromPlace:CoreClass{
    let id:String
    let name:String
}
struct ToPlace:CoreClass{
    let id:String
    let name:String
}
class AwesomePlace{
    init(place:FromPlaceOrToPlace){
        //Be able to write place.id or place.name here pls
    }
}
protocol FromPlaceOrToPlace {}
extension FromPlace:FromPlaceOrToPlace{}
extension ToPlace:FromPlaceOrToPlace{}
是的,我知道,应该只有一个
结构位置:CoreClass
。在这件事上我没有任何选择,因为这段代码是在很远的地方自动生成的。你能不能幽默地让我把这件事弄明白

CoreClass
是他们的共同点,但与此无关

我也无法更改文件。锁上了。不,我不想打开它

假设我有自己的类,名为
AwesomePlace
。我想用任何其他地方来初始化我的很棒的地方,比如:

struct FromPlace:CoreClass{
    let id:String
    let name:String
}
struct ToPlace:CoreClass{
    let id:String
    let name:String
}
class AwesomePlace{
    init(place:FromPlaceOrToPlace){
        //Be able to write place.id or place.name here pls
    }
}
protocol FromPlaceOrToPlace {}
extension FromPlace:FromPlaceOrToPlace{}
extension ToPlace:FromPlaceOrToPlace{}
我希望能够将FromPlace或ToPlace的实例发送到此init,它保留了访问正确变量的可能性。由于其他代码是自动生成的,我需要根据结构中的变量自动生成,而不需要手动中间人

我在想我可以这样做:

struct FromPlace:CoreClass{
    let id:String
    let name:String
}
struct ToPlace:CoreClass{
    let id:String
    let name:String
}
class AwesomePlace{
    init(place:FromPlaceOrToPlace){
        //Be able to write place.id or place.name here pls
    }
}
protocol FromPlaceOrToPlace {}
extension FromPlace:FromPlaceOrToPlace{}
extension ToPlace:FromPlaceOrToPlace{}
但是在这样做的过程中,我失去了从PlaceOrtPlace访问
中任何变量的能力,因为它没有任何变量。为了“修复”这个问题,我可以在协议中插入公共变量,但我不想这样做。我不能在这里做任何手工工作。这些自动生成的代码可能会经常更改

你知道我要去哪里吗?这样的事情有可能发生吗?我不必像通常那样填写协议中的公共变量


例如,我是否可以创建一个从
FromPlace
继承的协议,然后为继承该协议的
ToPlace
创建一个扩展?如果可能的话,使用其中一个作为通用“协议”(或任何协议)的“基础”是可以的。

为了打印
FromPlace
ToPlace
中的
init
变量,使用
FromPlace或oplace
参数,您应该能够检查
FromPlace或oplace
的类型,将其投射并展开为该类型,如下所示:

init(place:FromPlaceOrToPlace){
    if let fromPlace = place as? FromPlace {
        print(fromPlace.name)
        print(fromPlace.id)
    } else if let toPlace = place as? ToPlace {
        print(toPlace.name)
        print(toPlace.id)
    }
}

在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)

只有相关的初始值设定项会被调用。

如果自动生成的代码经常更改,那么
AwesomePlace.init()中的代码也会被调用,对吗?如果这个
init
可以依赖一个公共子集,那么在
AnyPlace
协议中编写一次也无妨…@Gereon我想你是对的。。我只是希望有一种不用手动操作的方法来解决这个问题。在我的实际情况中,这些
Place
-structs中有很多变量。其中许多是嵌套结构,它们也基于相同的自动生成逻辑,具有相同的内容和不同的名称。我必须对很多结构执行这种逻辑,这让我有点难过,因为对象首先是自动生成的。我希望它完全自动化。要么是这个,要么每个都创建一个init,我想..是的,这是我最不想使用的选项。。与我真正面对的情况相比,我的例子非常简单。至少有5个不同的
Place
-变体,每个变体都包含大量变量。我必须写5个Looong和相同的初始化:(这有点像我通常会做的,但我的目标是不必这样做。我问题中的示例被严重简化。至少有5种不同的
Place
,每个变量都有大量的变量。在我的实际情况下,这种解决方案将导致初始化器有200多行:(