gpt4 book ai didi

swift - 如何要求在 Swift 协议(protocol)中定义枚举

转载 作者:IT王子 更新时间:2023-10-29 05:29:13 26 4
gpt4 key购买 nike

是否可以让协议(protocol)要求定义一个枚举?

//trying to do this
protocol JSONEncodable {
enum PropertyName // Type not allowed here
func valueForProperty(propertyName:PropertyName) -> Any
}

//which would be implemented like this
struct Person : JSONEncodable {
var firstName : String
var lastName : String

enum PropertyName {
case FirstName
case LastName
func allValues() {
return [Person.PropertyName.FirstName, Person.PropertyName.LastName]
}
func stringValue() {
return "\(self)"
}
}
func valueForProperty(propertyName:PropertyName) -> Any {
switch propertyName {

case .FirstName:
return firstName

case .LastName:
return lastName
}
}
}

//so that I could do something like this
extension JSONEncodable {

func JSONObject() -> [String:AnyObject] {
var dictionary = [String:AnyObject]()
for propertyName in PropertyName.allValues {
let value = valueForProperty(propertyName)

if let valueObject = value as? AnyObject {
dictionary[propertyName.stringValue()] = valueObject

}else if let valueObject = value as? JSONEncodable {
dictionary[propertyName.stringValue()] = valueObject.JSONObject()
}

}
return dictionary
}
}

最佳答案

协议(protocol)可以有associatedtypes,这只需要在任何子类中都遵守:

enum MyEnum: String {
case foo
case bar
}

protocol RequiresEnum {
associatedtype SomeEnumType: RawRepresentable where SomeEnumType.RawValue: StringProtocol

func doSomethingWithEnum(someEnumType: SomeEnumType)
}

class MyRequiresEnum: RequiresEnum {
typealias SomeEnumType = MyEnum

func doSomethingWithEnum(someEnumType: SomeEnumType) {
switch someEnumType {
case .foo:
print("foo")
case .bar:
print("bar")
}
}
}

let mre = MyRequiresEnum()
mre.doSomethingWithEnum(.bar)

编辑 associatedtype 必须遵守

关于swift - 如何要求在 Swift 协议(protocol)中定义枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37353484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com