typealias veloci vs classi ereditate vuote

2

Sto lavorando su classi di modelli JSON in un progetto rapido. Esempi del campione JSON e delle classi sono di seguito. Nella risposta JSON, possono essere restituite molte statistiche uniche uniche, ma tutte seguono lo stesso modello di dizionario JSON. La sfida in cui mi sono imbattuto era il valore nel risultato JSON può essere un numero intero, un float e talvolta un intero che è davvero un enum. È meglio progettare di avere una sottoclasse vuota o typealias la classe base in modo che io possa fare riferimento ad essa con un nome significativo. Non ci sarà alcuna funzionalità aggiunta alle classi figlie. A questo punto mi vedo solo a usarli per nominare.

Esempi di codice sono riportati di seguito.

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 {}
    
posta Ben Robbins 24.02.2016 - 22:34
fonte

2 risposte

5

Questo è praticamente il punto della funzionalità tipealias in swift, per documentazione , quindi penso che sia il modo in cui dovresti andare.

    
risposta data 24.02.2016 - 23:22
fonte
0

Ho usato un enum per implementare questo genere di cose. Funziona molto come un sindacato di tipo C sicuro:

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!)")
        }
    }
}

Nel mio caso d'uso, ottengo JSON come la seguente:

{
    "type": "text",
    "data": "Hello World"
},
{
    "type": "flag",
    "data": true
},
{
    "type": "count",
    "data": 34
}
    
risposta data 17.03.2016 - 22:19
fonte

Leggi altre domande sui tag