如何在Swift中编写类似于协议组成的类型?
例如,我有一个likes
数据,它是一个字典,其值具有Int
或String
,但没有其他值。
likes: {
"1": {
"id": "l1"
"ts": 1551796878504
"userId": "u1"
}
}
当前,我使用类型为变量的
var likes: [String: [String: Any]]
但是,我希望它是
var likes: [String: [String: AlphaNum]]
我可以使用类似typealias AlphaNum = String & Int
之类的东西而不使用类或结构吗?
答案 0 :(得分:3)
我知道问题已经得到解答,但是在我看来,您好像正在尝试使用JSON,因此,我强烈建议您迅速使用Decodable
协议
可解码:一种可以从外部表示docs解码的类型
这将轻松处理所有传入的JSON,例如:
struct decodableIncomming: Decodable {
let name: String
let ID: Int
let externalURL: URL
}
let json = """
{
"name": "Robert Jhonson",
"ID": 1234256,
"externalURL": "http://someurl.com/helloworld"
}
""".data(using: .utf8)! // data in JSON which might be requested from a url
let decodedStruct = try JSONDecoder().decode(Swifter.self, from: json) // Decode data
print(decodedStruct) //Decoded structure ready to use
答案 1 :(得分:2)
您可以创建自己的协议,并让String
和Int
符合该协议:
protocol ValueProtocol {}
extension String:ValueProtocol{}
extension Int:ValueProtocol{}
var likes:[String : [String:ValueProtocol]] = ["1": [
"id": "l1",
"ts": 1551796878504,
"userId": "u1"
]
]
但是要使用ValueProtocols,您还必须根据需要向其添加诸如getValue
之类的功能。
答案 2 :(得分:2)
不,您不能这样做,因为您可以看到typealias AlphaNum = String & Int
是&
运算符而不是| \\ or
,并且您不能使用[String: [String: AlphaNum]]
,因为内部Dictionary
值基本上是String & Int
,值不能是两种类型之一,请查看此question,因为答案是关于创建虚拟协议的,并使用它,但是没有共享属性在Int
和String
之间,但在Description
之间,因此,即使使用虚拟protocol
,也必须在某个时候进行强制转换,除非您仅使用Description
引用到answer,
protocol IntOrString {
var description: String { get }
}
extension Int : IntOrString {}
extension String : IntOrString {}
并像这样var likes: [String: [String: IntOrString]]
使用它。
进入IntOrString
值后,您可以使用.description
属性。