2017-01-26 2 views
1

Ich habe diese Klasse mit einigen optionalen Eigenschaften einzufügen:Wie in Sqlite mit optionalen Parametern Swift 3

class Address { 
    var Id: Int64 
    var AddressType: Int64 
    var AddressStatus: Int64 
    var Address1: String? 
    var Address2: String? 
    var City: String? 
    var State: String? 
    var Zip: String? 
    var Country: String? 
    var Latitude: Double? 
    var Longitude: Double? 
} 

Ich versuche, in eine SQLite-Datenbank einzufügen, wie folgt aus:

let insert = table.insert(or: .replace, Id <- item.Id, AddressType <- item.AddressType, AddressStatus <- item.AddressStatus, Address1 <- item.Address1?, Address2 <- item.Address2?, City <- item.City?, State <- item.State?, Zip <- item.Zip?, Country <- item.Country?, Latitude <- item.Latitude?, Longitude <- item.Longitude?) 

Aber ich bekomme diesen Erstellungsfehler:

Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'? 

Wenn ich '!' es wird bauen, aber ich diese Fehlermeldung erhalten, wenn ich laufe: ‚!‘

unexpectedly found nil while unwrapping an Optional value 

Ich bin noch neu in Swift, aber von dem, was ich weiß, ich will nicht verwenden, Wenn der Wert Null sein kann, richtig?

Ich bin mir nicht sicher, was ich hier falsch mache.

Antwort

2

Nehmen Sie alle Konstanten Ihrer Klasseneigenschaften vor (deklarieren Sie mit let), und machen Sie sie nicht optional. Fügen Sie dazu ein erforderliches init() mit allen Parametern Ihrer Address-Eigenschaften hinzu. Übrigens ist es Swift-Konvention, Ihre Vars mit einem Kleinbuchstaben zu beginnen. Hinweis: Sie sollten Int anstelle von Int64 verwenden, sofern dies nicht erforderlich ist. In Bezug auf die Optionalität Ihrer Eigenschaften können Sie ihnen zur Initialisierungszeit nur einen Standardwert zuweisen. Btw ist es besser, eine Struktur zu verwenden, wenn Sie Ihr Objekt bestehen (NSCoding konform) vornehmen müssen:

struct Address { 
    let id: Int 
    let addressType: Int 
    let addressStatus: Int 
    let address1: String 
    let address2: String 
    let city: String 
    let state: String 
    let zip: String 
    let country: String 
    let latitude: Double? 
    let longitude: Double? 
    init(id: Int, addressType: Int, addressStatus: Int, address1: String = "", address2: String = "", city: String = "", state: String = "", zip: String = "", country: String = "", latitude: Double = nil, longitude: Double = nil) { 
     self.id = id 
     self.addressType = addressStatus 
     self.addressStatus = addressStatus 
     self.address1 = address1 
     self.address2 = address2 
     self.city = city 
     self.state = state 
     self.zip = zip 
     self.country = country 
     self.latitude = latitude 
     self.longitude = longitude 
    } 
} 

So können Sie Ihr neues Objekt Adresse wie folgt erstellen:

let address1 = Address(id: 1, addressType: 2, addressStatus: 3) 
let address2 = Address(id: 2, addressType: 3, addressStatus: 4, address1: "Any Address", latitude: 22.0, longitude: 43.0) // You don't need to add all parameters as long as you keep them in the same order as your initializer 

address2.latitude // 22.0 
+1

Danke, Das macht Sinn. Übrigens, meine Eigenschaften werden nur groß geschrieben, weil ich sie mit den Eigenschaften einer Web-API, die ich anrufe, konsistent halte. Danke noch einmal!! – Primico

+0

@Primico Sie sind willkommen –

+0

BTW, erbt meine "Adresse" -Klasse tatsächlich von Anthere-Klasse "BaseEntity" und das war der Grund, warum ich Klasse anstelle von Struct verwendet habe. Wenn ich struct versuche, gibt es einen Fehler über "Vererbung von Nicht-Protokoll-Typ ..." – Primico

Verwandte Themen