使用基于协议的枚举时遇到问题
Encountering issues when using a protocol based Enum
我目前拥有的简化版本,取自我设置的 Playground 文件:
import Foundation
/// Simplified protocol here
protocol MyProtocol: CaseIterable {
static var count: Int { get }
var name: String { get }
}
/// Simplified extension. This works fine with app
extension MyProtocol {
static var count: Int {
return Self.allCases.count
}
}
/// Simplified enum, this works fine as well
enum MyEnum: MyProtocol {
case value
var name: String {
return "name"
}
}
按预期使用以下方法:
print(MyEnum.count) // 1
let myEnum = MyEnum.value
print(myEnum.name) // name
但是,我想创建一个用 MyEnum
初始化的对象。
首先,我尝试了以下操作:
final class MyManager {
private let myEnum: MyProtocol
init(myEnum: MyProtocol) {
self.myEnum = myEnum
}
}
但是,我使用 MyProtocol
的两个地方都出现以下错误:
Protocol 'MyProtocol' can only be used as a generic constraint because
it has Self or associated type requirements
然后我将其切换为消除了错误的以下内容,但产生了一个新问题:
final class MyManager<MyProtocol> {
private let myEnum: MyProtocol
init(myEnum: MyProtocol) {
self.myEnum = myEnum
}
}
当我尝试访问 myEnum
的属性时,它们不会出现在 Xcode:
中
我需要能够访问 MyProtocol
中定义的属性,但这两种方法都不适合我,而且我 运行 没有想法。
MyProtocol
泛型与 MyProtocol
协议不同。你需要这样的东西
final class MyManager<MyP: MyProtocol> {
private let myEnum: MyP
init(myEnum: MyP) {
self.myEnum = myEnum
print(myEnum.name)
}
}
我还想指出,实现 count
的更好方法是扩展 CaseIterable
extension CaseIterable {
static var count: Int {
return Self.allCases.count
}
}
我目前拥有的简化版本,取自我设置的 Playground 文件:
import Foundation
/// Simplified protocol here
protocol MyProtocol: CaseIterable {
static var count: Int { get }
var name: String { get }
}
/// Simplified extension. This works fine with app
extension MyProtocol {
static var count: Int {
return Self.allCases.count
}
}
/// Simplified enum, this works fine as well
enum MyEnum: MyProtocol {
case value
var name: String {
return "name"
}
}
按预期使用以下方法:
print(MyEnum.count) // 1
let myEnum = MyEnum.value
print(myEnum.name) // name
但是,我想创建一个用 MyEnum
初始化的对象。
首先,我尝试了以下操作:
final class MyManager {
private let myEnum: MyProtocol
init(myEnum: MyProtocol) {
self.myEnum = myEnum
}
}
但是,我使用 MyProtocol
的两个地方都出现以下错误:
Protocol 'MyProtocol' can only be used as a generic constraint because it has Self or associated type requirements
然后我将其切换为消除了错误的以下内容,但产生了一个新问题:
final class MyManager<MyProtocol> {
private let myEnum: MyProtocol
init(myEnum: MyProtocol) {
self.myEnum = myEnum
}
}
当我尝试访问 myEnum
的属性时,它们不会出现在 Xcode:
我需要能够访问 MyProtocol
中定义的属性,但这两种方法都不适合我,而且我 运行 没有想法。
MyProtocol
泛型与 MyProtocol
协议不同。你需要这样的东西
final class MyManager<MyP: MyProtocol> {
private let myEnum: MyP
init(myEnum: MyP) {
self.myEnum = myEnum
print(myEnum.name)
}
}
我还想指出,实现 count
的更好方法是扩展 CaseIterable
extension CaseIterable {
static var count: Int {
return Self.allCases.count
}
}