2017-01-26 11 views
3

、Leo Dabusの優れたアドバイスはこちらHow to insert into Sqlite with optional parameters using Swift 3で、オプションのパラメータを許可するようにクラスを変更しました。しかし、私はオブジェクトを初期化するためのJSON文字列を受け入れる便利なメソッド(以下に示す)を持っています。しかし、一番下にあるself.initを見ると、 "!"を追加する必要があります。オプションのパラメータに置き換えます。私が理解するように、これらのパラメータはゼロになる可能性があるため、これは正しくありません。これを処理する良い方法はありますか? ありがとうございます!Swoft 3 initメソッド。

class Address : BaseEntity { 

    var Id: Int 
    var AddressType: Int 
    var AddressStatus: Int 
    var Address1: String 
    var Address2: String 
    var City: String 
    var State: String 
    var Zip: String 
    var Country: String 
    var Latitude: Double 
    var Longitude: Double 

    init(id: Int, addressType: Int, addressStatus: Int, address1: String = "", address2: String = "", city: String = "", state: String = "", zip: String = "", country: String = "", latitude: Double = 0, longitude: Double = 0, isDeleted: Bool, created: Date? = nil, createdBy: Int = 0, modified: Date? = nil, modifiedBy: Int = 0) { 
     self.Id = id 
     self.AddressType = addressType 
     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 
     super.init(isDeleted: isDeleted, created: created, createdBy: createdBy, modified: modified, modifiedBy: modifiedBy) 
    } 

    convenience init?(json: [String: Any]) { 

     guard let id = json["Id"] as? Int, 
      let addressType = json["AddressType"] as? Int, 
      let addressStatus = json["AddressStatus"] as? Int, 
      let isDeleted = json["IsDeleted"] as? Bool 
      else { 
       return nil 
     } 

     let address1 = json["Address1"] as? String 
     let address2 = json["Address2"] as? String 
     let city = json["City"] as? String 
     let state = json["State"] as? String 
     let zip = json["Zip"] as? String 
     let country = json["Country"] as? String 
     let latitude = json["Latitude"] as? Double 
     let longitude = json["Longitude"] as? Double 

     let date = Foundation.Date() 
     let created = date.dateFromJson(json: json["Created"] as? String) 
     let createdBy = json["CreatedBy"] as? Int 
     let modified = date.dateFromJson(json: json["Modified"] as? String) 
     let modifiedBy = json["ModifiedBy"] as? Int 

     self.init(id: id, addressType: addressType, addressStatus: addressStatus, address1: address1!, address2: address2!, city: city!, state: state!, zip: zip!, country: country!, latitude: latitude!, longitude: longitude!, isDeleted: isDeleted, created: created, createdBy: createdBy!, modified: modified, modifiedBy: modifiedBy!) 
    } 
} 
+3

もう一度、大文字で始まる名前を付けないでください。ウェブサイトでさえ、コードの色分けに問題があります。それはもうすぐスウィフトコンベンションで、人々があなたを助けるのが難しくなります。 –

+1

自分の 'Location'構造体(または' 'CLLocationCoordinate2D')(https://developer.apple.com/reference/corelocation/cllocationcoordinate2d)に' latitude'と 'longitude'を置くことをお勧めします。また、 'addressType'(そして恐らく' addressStatus')も 'enum'のように疑わしく聞こえます。 – Hamish

+0

あなたが作成した名前の名前を変更し、クラスまたは構造体の別の名前を変更することを忘れないでください。あなたの最後の質問で既にあなたに言及したFoundation.Date()は、疑わしく見えます。 –

答えて

3

名前付け規則に関する私のコメント以外に、プロパティを変数にする必要はありません。あなたは "??"を見てください。 nil合体オペレータ:

class 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 
    } 
    init?(json: [String: Any]) { 
     guard 
      let id = json["Id"] as? Int, 
      let addressType = json["AddressType"] as? Int, 
      let addressStatus = json["AddressStatus"] as? Int, 
      let isDeleted = json["IsDeleted"] as? Bool 
      else { 
       return nil 
     } 
     self.id = id 
     self.addressType = addressType 
     self.addressStatus = addressStatus 
     self.address1 = json["Address1"] as? String ?? "" 
     self.address2 = json["Address2"] as? String ?? "" 
     self.city = json["City"] as? String ?? "" 
     self.state = json["State"] as? String ?? "" 
     self.zip = json["Zip"] as? String ?? "" 
     self.country = json["Country"] as? String ?? "" 
     self.latitude = json["Latitude"] as? Double 
     self.longitude = json["Longitude"] as? Double 

     print(isDeleted) 
     // call super.init here 
    } 
} 

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 
print(address1.id)   // 1 
print(address1.address1) // "" empty String 
print(address2.latitude ?? "nil") // 22.0 
print(address2.longitude ?? "nil") // 43.0 
+1

私は変数を削除し、nil coalescing演算子を使用すると完全に私のために動作すると思います。あなたは素晴らしいです! – Primico

+0

fusingイニシャライザは、指定されたイニシャライザ権限の何らかの形式ですか? – Honey

+0

@Honey https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/MultipleInitializers.html –

関連する問題