it-swarm-ja.com

swift typealiasと空の継承クラス

SwiftプロジェクトでJSONモデルクラスに取り組んでいます。サンプルJSONとクラスの例を以下に示します。JSON応答では、さまざまな一意の統計が返される可能性がありますが、それらはすべて同じJSONディクショナリパターン。私が遭遇した課題は、JSON結果の値が整数、浮動小数点数、場合によっては実際には列挙型の整数になる可能性があることでした。空のサブクラスまたは基本クラスのタイプエイリアスを使用する方がよい設計ですか。意味のある名前で参照できます。子クラスに機能が追加されることはありません。現時点では、名前付けにそれらを使用しているだけです。

コードサンプルは以下のとおりです。

JSON
"score": { /* <- statistic identified */
  "basic": {
    "value": 2410 /* <- value can be an int, float or int thats really an enum */
    "displayValue": "2410" /* <- string value for human consumption */
  }
}

Swift model class
Double and Enum classes snipped out for brevity

public class IntValueBase : ValueBase {
  public private(set) var value: Int = 0
  public required init(json: JSON) throws {
    try super.init(json: json)
    self.value = try json.int("basic", "value")
  }
}

// Typealias option
typealias Score = IntValueBase

// inheritance option
public class Score: IntValueBase {}
2
Ben Robbins

documentation によると、これはSwiftのtypealias機能のポイントであるため、これを実行する必要があると思います。

5
JSquared

私はこの種のものを実装するために列挙型を使用しました。これは、タイプセーフなCユニオンのように機能します。

enum AttributeValueType {
    case Text(String)
    case DateTime(NSDate)
    case Flag(Bool)
    case Count(Int)
    case Decimal(Double)
}

extension AttributeValueType {
    // I'm using SwiftyJSON, hence the `JSON` type
    init(json: JSON) {
        switch json["type"].string! {
        case "text":
            self = .Text(json["data"].string!)
        case "date_time":
            let dateString = json["data"].string!
            let date = dateTimeFormatter.dateFromString(dateString)!
            self = .DateTime(date)
        case "flag":
            self = .Flag(json["data"].bool!)
        case "count":
            self = .Count(json["data"].int!)
        case "decimal":
            self = .Decimal(json["data"].double!)
        default:
            fatalError("missing type = \(json.string!)")
        }
    }
}

私のユースケースでは、次のようなJSONを取得します。

{
    "type": "text",
    "data": "Hello World"
},
{
    "type": "flag",
    "data": true
},
{
    "type": "count",
    "data": 34
}
0
Daniel T.