你如何声明一个'enum'类型的参数(即它可以采用任何枚举)?

时间:2016-08-03 17:53:02

标签: c# swift enums arguments

在C#中,您可以通过将参数声明为类型Enum来编写一个将任何枚举值作为参数的函数,就像这样......

public enum FirstEnum
{
    A,
    B,
    C
}

public enum SecondEnum
{
    D,
    E,
    F
}

public void StoreValue(Enum key, object value)
{
    myDictionary[key] = value; <-- Uses the enum as a key
}

StoreValue(FirstEnum.A,  someItem); // Using the first enum type
StoreValue(SecondEnum.D, someItem); // Using the second enum type
StoreValue("Sam",        someItem); // Won't compile since 'Sam' is not an enum

你能在Swift中做类似的事情吗?我知道你可以将参数someEnum声明为一个字符串并以这种方式使用它,但我试图找出它是否可以像C#一样强制执行Enum。

2 个答案:

答案 0 :(得分:0)

不完全是。重点是打字很强。

您应该创建一个协议,使枚举符合它并在您的接口定义中使用它。

答案 1 :(得分:0)

根据Wain的建议,你可以这样写:

enum FirstEnum: String
{
case
    A,
    B,
    C
}

enum SecondEnum: String
{
case
    D,
    E,
    F
}

//create a protocol
public protocol StringKeyEnum {
    var rawValue: String {get}
}
//make the enumeration(s) conform to it
extension FirstEnum: StringKeyEnum {}
extension SecondEnum: StringKeyEnum {}

var myDictionary: [String: AnyObject] = [:]
//use it in your interface definitions
public func storeValue(key: StringKeyEnum, value: AnyObject)
{
    myDictionary[key.rawValue] = value //<-- Uses the rawValue of enum as a key
}
let someItem = ""
storeValue(FirstEnum.A,  value: someItem) // Using the first enum type
storeValue(SecondEnum.D, value: someItem) // Using the second enum type
storeValue("Sam",        value: someItem) // Won't compile since 'Sam' is not a StringKeyEnum