协议扩展中的嵌套结构:类型“ ...”不能嵌套在通用函数“ ...()”中

时间:2019-03-07 16:14:29

标签: swift protocols

我有一个协议,比如说水果(见下文)。

在一种我想使用自定义结构的方法中。 这将导致以下错误:

  

类型'Packet'不能嵌套在通用函数'saveObject()'中

为什么不允许这样做?

protocol Fruit: Codable
{
    var vitamines: Int { get }
    var description: String { get }
}

extension Fruit
{
    func saveObject()
    {
        struct Packet
        {
            let val1, val2, val3: Int
        }
        let packet = Packet(val1: vitamines, val2: 0, val3: 0)
    }
}

寻找解决方案或可行的替代方案。
我尝试过使用元组,但是我需要将数据包保存到数据中,据我所知,使用元组不容易做到这一点。

1 个答案:

答案 0 :(得分:1)

您不能以这种方式在扩展的通用结构内部嵌套新类型。允许这样做可能会变得非常复杂,因为尚不清楚此类型是Fruit.saveObject.Packet还是<ConformingType>.saveObject.Packet。例如,考虑以下(合法)代码,以了解如何避免这些类型的类型,并且系统必须处理它们,包括知道如何向其分配方法,它们需要多少存储空间,等等。

protocol P {}

func x() -> P {
    struct T: P {}
    return T()
}

type(of: x())

如果将其更改为通用x(),则不再合法:

func x<Y>() -> P {
    struct T: P {} // error: type 'T' cannot be nested in generic function 'x()'
    return T()
}

也就是说,如果您认为应该更改语言以允许这样做,则Swift Evolution是建议它的过程。您首先应该考虑一下,如果Fruit具有关联类型,如果saveObject()本身是通用类型,并且Packet包括对在这两个位置中定义的类型变量的引用,那么您将如何工作。 (我并不是说这些根本不是无法解决的问题。这可能是一个出色的功能,并且可能设计得很好。您只需要考虑一下它如何与语言的其他功能交互)。

解决方案是将Packet移到扩展的顶层和协议之外的顶层。

相关问题