2017-04-03 10 views
0

Swiftでオプションの初期化パラメータを作成することは可能ですか?APIコールから返された値でJSONからオブジェクトを作成できますが、後でそのオブジェクトを保存するときに、私が前に持っていたURLのひとつにUIImageがあります。Swift 3オプションパラメータ

例:

class Story: NSObject, NSCoding { 
     var id: Int? 
     var title, coverImageURL: String? 
     var coverImage: UIImage? 

    required init?(anId: Int?, aTitle: String?, aCoverImageURL: String?) { 
      self.id = anId 
      self.title = aTitle 
      self.coverImageURL = aCoverImageURL 
    } 
    convenience init?(json: [String: Any]) { 
      let id = json["id"] as? Int 
      let title = json["title"] as? String 
      let coverImageURL = json["cover_image"] as? String 

      self.init(
       anId: id, 
       aTitle: title, 
       aCoverImageURL: coverImageURL, 
      ) 
     } 

その後、私はメモリ

//MARK: Types 
    struct PropertyKey { 
     static let id = "id" 
     static let title = "title" 
     static let coverImageURL = "coverImageURL" 
     static let coverImage = "coverImage" 
    } 

    //MARK: NSCoding 
    func encode(with aCoder: NSCoder) { 
     aCoder.encode(id, forKey: PropertyKey.id) 
     aCoder.encode(title, forKey: PropertyKey.title) 
     aCoder.encode(coverImageURL, forKey: PropertyKey.coverImageURL) 
     aCoder.encode(coverImage, forKey: PropertyKey.coverImage) 
    } 

    required convenience init?(coder aDecoder: NSCoder) { 
     guard let id = aDecoder.decodeObject(forKey: PropertyKey.id) as? Int else { 
      os_log("Unable to decode the id for a Story object.", log: OSLog.default, type: .debug) 
      return nil 
     } 
     guard let title = aDecoder.decodeObject(forKey: PropertyKey.title) as? String else { 
      os_log("Unable to decode the title for a Story object.", log: OSLog.default, type: .debug) 
      return nil 
     } 

     let coverImageURL = aDecoder.decodeObject(forKey: PropertyKey.coverImageURL) as? String 
     let coverImage = aDecoder.decodeObject(forKey: PropertyKey.coverImage) as? UIImage 

     self.init(
      anId: id, 
      aTitle: title, 
      aCoverImageURL: coverImageURL, 
      coverImage: coverImage, 
     ) 
    } 

にオブジェクトを保存するには、この理にかなっていますか?私は、APIからの応答を取得するとすぐにStoryオブジェクトを保存できるようにしたいが、後でストーリーをメモリに保存すると、取り込まれたUIImageをcoverImageに保存できるようにしたい。

どうすればいいですか?

+1

したがって、coverImageのみをオプションにする必要があります –

+0

あなたはUIImageをデータに変換して、ディスクに保存できるようにしてください(エンコード) –

+0

@LeoDabus correct。 – Arel

答えて

0

この回答には誰も簡単な点はありませんでしたが、答えは単純にプロパティのオプションを作成してから、それらを値または無制限に設定することです。必要に応じて、特定の値を自動的にnilに設定する便利なイニシャライザを作成することもできます。だから、私のアプリを例に挙げて、私はAPIコールから構築されたモデルを持っています。そのモデルはid,created_atなどの値がありますが、レコードはサーバーに保存されるまで存在しませんが、ローカルにオブジェクトを作成して保存し、最終的にサーバーに送信するため、そのモデルを設定する必要があります。そう、ここで、JSONからオブジェクトを作成するときの値を超えるだけ私がやったことです:あなたが見ることができるように

class Story: NSObject, NSCoding { 
     var id: Int? 
     var title, coverImageURL: String? 
     var coverImage: UIImage? 

    required init?(anId: Int?, aTitle: String?, aCoverImageURL: String?) { 
      self.id = anId 
      self.title = aTitle 
      self.coverImageURL = aCoverImageURL 
    } 
    convenience init?(json: [String: Any]) { 
      let id = json["id"] as? Int 
      let title = json["title"] as? String 
      let coverImageURL = json["cover_image"] as? String 

      self.init(
       anId: id, 
       aTitle: title, 
       aCoverImageURL: coverImageURL, 
      ) 
     } 

     convenience init?(aTitle: String, aCoverImage: UIImage?) { 
      let title = aTitle 
      let subtitle = aSubtitle 
      let coverImage = aCoverImage 
      let isActive = activeStatus 

      self.init(
       anId: nil, 
       aTitle: title, 
       aCoverImageURL: nil, 
       aCoverImage: coverImage, 
      ) 
     } 

、私はローカルオブジェクトを作成していたとき、私は唯一の値のうちの2つを設定し、その他の値は、 nilに設定してください。値をnilに設定するには、設定時にオプションにしてください。シンプル!