2015-10-13 26 views
0

我有一個init類的構建方法,我想用它來創建類的實例。SwiftyJSON錯誤

代碼如下

class Article { 

let id:Int 
let title:String 
let subtitle:String 
let editor1:String 
let mainImage:NSData 

init(id:Int, title:String, subtitle:String, editor1:String, mainImage:NSData) { 
    self.id = id 
    self.title = title 
    self.subtitle = subtitle 
    self.editor1 = editor1 
    self.mainImage = mainImage 
} 

class func build(json:JSON) -> Article { 
     id = Int(json["id"].string), 
     title = json["title"].string, 
     subtitle = json["subtitle"].string, 
     editor1 = json["editor1"].string, 
     mainImage = json["images"]["main"].rawData() { 
      return Article(
       id: id, 
       title: title, 
       subtitle: subtitle, 
       editor1: editor1, 
       mainImage: mainImage) 
    } 
} 

} 

但我有錯誤

enter image description here

我在做什麼錯?

回答

1

SwiftyJSON的.rawData()是一個可選的getter。

所以我想你想要做的就是用什麼if let

class func build(json:JSON) -> Article? { 
    id = Int(json["id"].string) 
    title = json["title"].string 
    subtitle = json["subtitle"].string 
    editor1 = json["editor1"].string 
    if let mainImage = json["images"]["main"].rawData() { 
     return Article(
      id: id, 
      title: title, 
      subtitle: subtitle, 
      editor1: editor1, 
      mainImage: mainImage) 
    } else { 
     // ... 
     return nil 
    } 
} 

此外,它看起來像你複製/從你的文章初始化粘貼參數早些時候在函數聲明他們,但你忘了在行結尾處擺脫逗號。

更新

你的問題是,你的類屬性是不可變的(與let聲明),但是這個功能裏面你正在試圖改變自己的價值觀:

id = Int(json["id"].string) 

這被解釋爲

self.id = Int(json["id"].string) 

而且你不能改變0123的值,因爲它是不可變的。

解決方案:

1-使性能可變的使用var代替let。例如:

var id:Int 
var title:String 
var subtitle:String 
var editor1:String 
var mainImage:NSData 

2 - 不要因爲你要去反正跟你的新對象初始化函數中替換的屬性。例如:

class func build(json:JSON) -> Article? { 
    if let img = json["images"]["main"].rawData() { 
     return Article(
      id: Int(json["id"].string), 
      title: json["title"].string, 
      subtitle: json["subtitle"].string, 
      editor1: json["editor1"].string, 
      mainImage: img) 
    } else { 
     // ... 
     return nil 
    } 
} 

更新2

如果編譯器抱怨 「沒有打上試試」,做了 「如果讓」 與 「嘗試」:

if let img = try? json["images"]["main"].rawData() { 

說明: SwiftyJSON可能已經改變了這個方法,但沒有更新文檔(或者我沒有找到它)。它以前返回一個可選的,現在似乎「拋出」,而不是。用「試試?」可以讓你再次選擇它。

+0

有些事情是錯的,不能得到什麼https://s.mail.ru/QYaHvmFrpj55/img-2015-10-13-18-25-46.png –

+0

非常感謝!完全錯過讓事情 –

+0

不客氣。 :) – Moritz

1

夫婦的事情看起來。

  1. 您應該返回Article?,因爲您有機會返回零。
  2. id = Int(json["id...之類的東西之後,你有許多無關的逗號。擺脫他們。
  3. 封閉似乎沒有必要。只要首先檢查有效的JSON,如果它不好返回零,否則建立它並返回文章。
0

你有,它們不應該是。試試這個:

class func build(json:JSON) -> Article { 
    id = Int(json["id"].string) 
    title = json["title"].string 
    subtitle = json["subtitle"].string 
    editor1 = json["editor1"].string 
    mainImage = json["images"]["main"].rawData() { 
     return Article(
      id: id, 
      title: title, 
      subtitle: subtitle, 
      editor1: editor1, 
      mainImage: mainImage) 
    } 
}