Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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保留字“enum”吗?_Swift_Enums - Fatal编程技术网

我可以扩展Swift保留字“enum”吗?

我可以扩展Swift保留字“enum”吗?,swift,enums,Swift,Enums,例如,我想添加如下内容: extension enum : T { convenience init? (rawData: T?) -> enum? { guard let rawData = rawData else { return nil; } return self.init(rawData: rawData); } } 我知道这可能不是我需要扩展枚举的最佳情况,但我只想探索一下可能性。谢谢。在“Swift编程语言”中强调: 扩展向

例如,我想添加如下内容:

extension enum : T {
    convenience init? (rawData: T?) -> enum? {
        guard let rawData = rawData else { return nil; }
        return self.init(rawData: rawData);
    }
}
我知道这可能不是我需要扩展枚举的最佳情况,但我只想探索一下可能性。谢谢。

在“Swift编程语言”中强调:

扩展向现有类、结构、枚举或协议类型添加新功能

enum是关键字,不是类型,因此扩展enum不能 被定义

如果您打算从 可选原始值,然后您可以定义:

这将向符合 RawRepresentable协议,特别是所有枚举类型 使用原始值类型

例如:

enum Foo: String {
    case a
    case b
}

print(Foo(rawData: "a"))  // Optional(Foo.a)
print(Foo(rawData: "x"))  // nil
print(Foo(rawData: nil))  // nil
在“Swift编程语言”中,重点增加:

扩展向现有类、结构、枚举或协议类型添加新功能

enum是关键字,不是类型,因此扩展enum不能 被定义

如果您打算从 可选原始值,然后您可以定义:

这将向符合 RawRepresentable协议,特别是所有枚举类型 使用原始值类型

例如:

enum Foo: String {
    case a
    case b
}

print(Foo(rawData: "a"))  // Optional(Foo.a)
print(Foo(rawData: "x"))  // nil
print(Foo(rawData: nil))  // nil


不,你不能那样想。这没有道理。您可以扩展RawRepresentable协议。@Sulthan:Oops,还没有看到您更新的评论。@MartinR我看到了,但我不明白他扩展RawRepresentable协议的确切意思。虽然我现在从你的回答中知道了D@MartinR我花了一段时间才明白他想做什么。@Sulthan实际上,我正在探索是否可以通过扩展enum来做其他事情。这就是为什么我没有明确地写下我打算用上面的代码做什么,因为我的主要问题是扩展enum是否可能,如果可能,如何扩展。但是从答案中,我得到了一些新的信息。不,你不能那样想。这没有道理。您可以扩展RawRepresentable协议。@Sulthan:Oops,还没有看到您更新的评论。@MartinR我看到了,但我不明白他扩展RawRepresentable协议的确切意思。虽然我现在从你的回答中知道了D@MartinR我花了一段时间才明白他想做什么。@Sulthan实际上,我正在探索是否可以通过扩展enum来做其他事情。这就是为什么我没有明确地写下我打算用上面的代码做什么,因为我的主要问题是扩展enum是否可能,如果可能,如何扩展。但是从答案中,我得到了一些新的信息。令人惊叹的但我很好奇,为什么RawRepresentable的扩展可以使enum能够从可选的RawData实例化。因为在我的逻辑中,代码看起来像是修改了参数,而不是实例化过程本身。如果enum仍然不能从optional实例化,那么不管RawData现在是否可以接受optional,它仍然是不兼容的,对吗?@ChenLiYong:我不确定我是否理解你的问题。初始化?原始数据:原始值?定义一个新的failable init方法,该方法要么返回nil,要么打开参数并调用RawRepresentable协议的现有init?rawValue:。@ChenLiYong它不会使enum从可选值实例化,而是使实现RawRepresentable的类型能够从可选值实例化。碰巧的是,所有具有原始值的枚举(即以enum MyType:Type{…}形式声明的所有内容)都采用RawRepresentableLight,great。顺便说一句,@MartinR发现,在我实现了扩展之后,我用随机字符串提供的rawData实例化enum的代码仍然给了我错误:可选类型“string”的值没有展开;你想用“!”吗还是“?”?我已经复制并粘贴了您的代码,就像它一样,我不认为代码需要一些修改,因为它已经是通用的了。或者我需要做一些修改吗?@ChenLiYong:这也适用于基于字符串的枚举,无需修改。我已经更新了示例。是的。令人惊叹的但我很好奇,为什么RawRepresentable的扩展可以使enum能够从可选的RawData实例化。因为在我的逻辑中,代码看起来像是修改了参数,而不是实例化过程本身。如果enum仍然不能从optional实例化,那么不管RawData现在是否可以接受optional,它仍然是不兼容的,对吗?@ChenLiYong:我不确定我是否理解你的问题。初始化?原始数据:原始值?定义一个新的failable init方法,该方法要么返回nil,要么打开参数并调用RawRepresentable协议的现有init?rawValue:。@ChenLiYong它不会使enum从可选值实例化,而是使实现RawRepresentable的类型能够从可选值实例化。碰巧,所有具有原始值的枚举,即
以enum MyType:Type{…}的形式声明采用RawRepresentableLight,太好了。顺便说一句,@MartinR发现,在我实现了扩展之后,我用随机字符串提供的rawData实例化enum的代码仍然给了我错误:可选类型“string”的值没有展开;你想用“!”吗还是“?”?我已经复制并粘贴了您的代码,就像它一样,我不认为代码需要一些修改,因为它已经是通用的了。或者我需要做一些修改吗?@ChenLiYong:这也适用于基于字符串的枚举,无需修改。我已经更新了示例。