簡體   English   中英

從原始值推斷Swift初始化程序

[英]Infer Swift initialiser from a primitive value

我有以下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枚舉, 這就是原因

我認為您需要遵守以下協議:

  • 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM