我有一个协议,比如说水果(见下文)。
在一种我想使用自定义结构的方法中。 这将导致以下错误:
类型'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)
}
}
寻找解决方案或可行的替代方案。
我尝试过使用元组,但是我需要将数据包保存到数据中,据我所知,使用元组不容易做到这一点。
答案 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移到扩展的顶层和协议之外的顶层。