Присвойте инициализатор Swift из примитивного значения - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующее перечисление Swift, обеспечивающее использование только чистых типов json.

public enum JSONValue {
    case string(String)
    case integer(Int)
    case double(Double)
    case bool(Bool)

    public init(_ value: String) {
        self = .string(value)
    }

    public init(_ value: Int) {
        self = .integer(value)
    }

    public init(_ value: Double) {
        self = .double(value)
    }

    public init(_ value: Bool) {
        self = .bool(value)
    }
}

Чтобы инициализировать значение JSON, нужно сделать

let json = JSONValue.string("my value")

или в случае словаря

let params: [String: JSONValue] = [
    "my string": JSONValue.string("my value"),
    "my int": JSONValue.init(10)
]

Нет ли способа вывести инициализатор из значения примитива, чтобы облегчить его использование следующим образом:

let json: JSONValue = "my value"

let params: [String: JSONValue] = [
    "my string": "my value",
    "my int": 10
]

(не по теме, но если вам интересно, зачем мне этот JSONValue enum, это причина

1 Ответ

0 голосов
/ 27 июня 2018

Я думаю, вам нужно соответствовать следующим протоколам:

  • ExpressibleByBooleanLiteral
  • ExpressibleByIntegerLiteral
  • ExpressibleByFloatLiteral
  • ExpressibleByStringLiteral

Как это

public enum JSONValue: ExpressibleByBooleanLiteral, ExpressibleByIntegerLiteral, ExpressibleByFloatLiteral, ExpressibleByStringLiteral {
    public typealias BooleanLiteralType = Bool
    public typealias IntegerLiteralType = Int
    public typealias FloatLiteralType = Double
    public typealias StringLiteralType = String

    case string(String)
    case integer(Int)
    case double(Double)
    case bool(Bool)

    public init(stringLiteral value: String) {
        self = .string(value)
    }

    public init(integerLiteral value: Int) {
        self = .integer(value)
    }

    public init(floatLiteral value: Double) {
        self = .double(value)
    }

    public init(booleanLiteral value: Bool) {
        self = .bool(value)
    }
}

Это позволит компилятору совершить магию:

let jsonValue: JSONValue = "Hello World"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...