有没有可能让一个协议要求定义一个枚举?
//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
}
}
2条答案
按热度按时间wlzqhblo1#
协议可以有
associatedtypes
,它只需要在任何子类中遵守:编辑:
associatedtype
必须遵守nvbavucw2#
我认为您可以使用一个与
RawRepresentable
兼容的associatedtype
来实现下面是一个例子:
如果你需要指定
RawRepresentable
的类型,比如String
,你可以这样做:现在,如果您尝试使用
enum
以外的任何东西来实现该协议,而不是将String
作为RawRepresentable
,则会出现编译器错误。希望能帮上忙。