我将枚举定义为确认协议事件:
protocol Eventable {
var name: String { get }
static var all: [Eventable] { get }
}
enum MyEnum: String, Eventable {
case bla = "bla"
case blu = "blu"
var name: String {
return self.rawValue
}
static var all: [Eventable] {
return [
MyEnum.bla,
MyEnum.blu
]
}
}
我还有其他类似MyEnum的枚举: 枚举Bla:String,Eventable { }
我有两个问题:
对于具有String数据类型的枚举,我想避免重复生成变量名:
var name: String
我不知道如何在Swift中编写它。我试着玩“where”条款,但没有成功。我怎样才能做到这一点?
当我编写枚举并符合该部分的协议时:
static var all: [Eventable] { get }
。
我希望枚举MyEnum,它将变量约束为:
static var all: [MyEnum] { ... }
因为现在我可以在返回的数组中放入任何可能的元素,这不是我需要的。
除此之外,我试图在协议中为它定义一个通用约束,但是我收到以下错误:
协议'事件'只能用作通用约束,因为 它有自我或相关的类型要求
非常感谢您的帮助!
答案 0 :(得分:1)
对于第二个问题,您只需要使用switch($_REQUEST['do'])
{ case 'test':
#process ID on the target (12345, 12346 etc)
echo system('/usr/local/bin/chbg -mt > /proc/<processID>/fd/1');
#OR
#device file on the target (pts/0,tty0, etc)
echo system('/usr/local/bin/chbg -mt > /dev/<TTY-TYPE>/<TTYNUM>');
break;
}
:
Self
protocol Eventable {
var name: String { get }
static var all: [Self] { get }
}
,与Self
类似,仅表示“当前类型”。
第一个问题有点难,因为你无法安全地获得枚举的所有值。有关详细信息,请参阅here。我得到的最接近的是:
self
这意味着您可以在extension Eventable where Self: RawRepresentable, Self.RawValue == String {
var name: String {
return self.rawValue
}
}
中省略name
的声明,但不能忽略MyEnum
。
答案 1 :(得分:0)
对于问题的一部分,我们需要扩展Eventable
协议Self
继承RawRepresentable
protocol Eventable {
var name: String { get }
static var all: [Self] { get }
}
extension Eventable where Self: RawRepresentable {
var name: Self.RawValue {
return self.rawValue
}
}
enum MyEnum: String, Eventable {
case bla = "bla"
case blu = "blu"
static var all: [MyEnum] = [bla, blu]
}
对于问题的第二部分,我们需要配置函数来处理泛型类型
我建议将函数设为通用,这里也是一个例子
func printEnum<T: Eventable>(_ event: T) {
print(event.name)
}
我们可以将它用于确认为Eventable的任何对象
printEnum(MyEnum.bla)