Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 错误声明协议是泛型类型,但未使用泛型_Swift_Generics_Compiler Errors_Swift Extensions - Fatal编程技术网

Swift 错误声明协议是泛型类型,但未使用泛型

Swift 错误声明协议是泛型类型,但未使用泛型,swift,generics,compiler-errors,swift-extensions,Swift,Generics,Compiler Errors,Swift Extensions,我希望实现类似于Notification.Name的模式,任何人都可以稍后通过扩展添加一个,如下所示: 斯威夫特4 公共协议Foo{ 变量栏:字符串{get} } 公共结构FooImpl:Foo{ 公共出租条:字符串 } 公共分机室{ 公共静态let baz:Foo=FooImpl(条:“baz”) } //理想用法: 使用safoo(.baz)的某些函数 这对我来说似乎很好,但在编译时我遇到了一个令人困惑的错误: /path/to/main.swift:24:23:错误:泛型类型中不支持静态

我希望实现类似于
Notification.Name
的模式,任何人都可以稍后通过
扩展添加一个,如下所示:

斯威夫特4
公共协议Foo{
变量栏:字符串{get}
}
公共结构FooImpl:Foo{
公共出租条:字符串
}
公共分机室{
公共静态let baz:Foo=FooImpl(条:“baz”)
}
//理想用法:
使用safoo(.baz)的某些函数
这对我来说似乎很好,但在编译时我遇到了一个令人困惑的错误:

/path/to/main.swift:24:23:错误:泛型类型中不支持静态存储属性
公共静态let baz:Foo=FooImpl(条:“baz”)
~~~~~~     ^

这里发生了什么,解决方案是什么?

这是一条奇怪的错误消息,但您的代码无论如何都不应该编译。扩展不支持存储的属性,因此出现错误

通过删除
static
关键字并将
baz
作为存储属性,您会得到一个有意义的错误:

扩展不能包含存储的属性

将声明更改为计算属性(并因此声明它是可变的)错误会神奇地消失

public protocol Foo {
    var bar: String { get }
}

public struct FooImpl: Foo {
    public let bar: String
}


public extension Foo {
    public static var baz: Foo {
        return FooImpl(bar: "baz")
    }
}

这是一条奇怪的错误消息,但您的代码无论如何都不应该编译。扩展不支持存储的属性,因此出现错误

通过删除
static
关键字并将
baz
作为存储属性,您会得到一个有意义的错误:

扩展不能包含存储的属性

将声明更改为计算属性(并因此声明它是可变的)错误会神奇地消失

public protocol Foo {
    var bar: String { get }
}

public struct FooImpl: Foo {
    public let bar: String
}


public extension Foo {
    public static var baz: Foo {
        return FooImpl(bar: "baz")
    }
}

但这很好:
扩展FooImpl{static let baz=FooImpl(bar:“baz”)}
。正如我所说,这是Swift中的一种常见做法,尤其是在
Notification.Name
中,当我尝试使用类似
let x=Foo.baz
的解决方案时,它允许语义创建和使用带有点前缀syntax的对象实例,我发现了一个新的令人困惑的错误:
静态成员“baz”不能用于协议元类型“Foo.protocol”
您实际上可以尝试运行代码,它编译时没有问题。还要看一下答案,它还解释了不能在协议扩展中存储属性。此外,您的注释中的示例与问题中的示例不同,注释一是结构扩展,而问题一是协议扩展。协议本身并不存在
let x=FooImpl.baz
有效,
let Foo.baz
无效。但这很好:
extension FooImpl{static let baz=FooImpl(bar:“baz”)}
。正如我所说,这是Swift中的一种常见做法,尤其是在
Notification.Name
中,当我尝试使用类似
let x=Foo.baz
的解决方案时,它允许语义创建和使用带有点前缀syntax的对象实例,我发现了一个新的令人困惑的错误:
静态成员“baz”不能用于协议元类型“Foo.protocol”
您实际上可以尝试运行代码,它编译时没有问题。还要看一下答案,它还解释了不能在协议扩展中存储属性。此外,您的注释中的示例与问题中的示例不同,注释一是结构扩展,而问题一是协议扩展。协议本身并不存在
let x=FooImpl.baz
有效,
let Foo.baz
无效。比较:。我同意这种情况下的诊断不是很好。相关的Swift错误:比较:。我同意这种情况下的诊断不是很好。相关的Swift错误: