我可以在Swift中编写类型吗?

时间:2019-03-25 09:38:43

标签: swift types composition

如何在Swift中编写类似于协议组成的类型?

例如,我有一个likes数据,它是一个字典,其值具有IntString,但没有其他值。

likes: {
    "1": {
        "id": "l1"
        "ts": 1551796878504
        "userId": "u1"
    }
}

当前,我使用类型为变量的

var likes: [String: [String: Any]]

但是,我希望它是

var likes: [String: [String: AlphaNum]]

我可以使用类似typealias AlphaNum = String & Int之类的东西而不使用类或结构吗?

3 个答案:

答案 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)

您可以创建自己的协议,并让StringInt符合该协议:

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,因为答案是关于创建虚拟协议的,并使用它,但是没有共享属性在IntString之间,但在Description之间,因此,即使使用虚拟protocol,也必须在某个时候进行强制转换,除非您仅使用Description引用到answer

 protocol IntOrString {
    var description: String { get }
}

extension Int : IntOrString {}
extension String : IntOrString {}

并像这样var likes: [String: [String: IntOrString]]使用它。

进入IntOrString值后,您可以使用.description属性。