Могу ли я создавать типы в Swift? - PullRequest
0 голосов
/ 25 марта 2019

Как мне составить типы, аналогичные составлению протокола в 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 или что-то подобное, без использования класса или структуры?

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

Я знаю, что на вопрос уже дан ответ, но мне кажется, что вы пытаетесь работать с JSON, и по этой причине я настоятельно рекомендую использовать протокол Decodable в swift

Декодируемый: Тип, который может декодировать себя из внешнего представления Документы

Это будет легко обрабатывать все входящие 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
2 голосов
/ 25 марта 2019

Нет, вы не можете, поскольку вы можете видеть typealias AlphaNum = String & Int, это &, оператор не | \\ or, и вы не можете использовать [String: [String: AlphaNum]], потому что внутреннее значение Dictionary в основном String & Int, значение можетНе будьте двух типов, один из них, посмотрите на этот вопрос , поскольку ответы о создании фиктивного протокола, и используйте это, однако нет общих свойств между Int и String, кроме одного, Description, поэтому даже с пустышкой protocol вам придется разыграть в какой-то момент, если только вы не используете Description, ссылаясь на ответ ,

 protocol IntOrString {
    var description: String { get }
}

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

Ииспользуя это так, var likes: [String: [String: IntOrString]].

После получения значения IntOrString вы можете использовать свойство .description.

2 голосов
/ 25 марта 2019

Вы можете создать свой собственный протокол и позволить String и Int соответствовать ему:

protocol ValueProtocol {}

extension String:ValueProtocol{}
extension Int:ValueProtocol{}


var likes:[String : [String:ValueProtocol]] = ["1": [
                    "id": "l1",
                    "ts": 1551796878504,
                    "userId": "u1"
                ]
            ]

Но чтобы использовать ValueProtocols, вам также необходимо добавить к нему такие функции, как getValueв зависимости от ваших потребностей.

...