2017-11-13 16 views
0

私はJSONを取得し、その値をstruct(Job)に入れる関数を持っています。これは、varのオプションなしで値を出力します。しかし、struct varをオプションで出力します。この問題を解決するために親切にお手伝いしてください。印刷結果とswift3オプションの値の問題

ここ
var newJob = Job() 
var joblist:[Job] = [] 

func parseJSON(json:Any){ 
    if let okJSON = json as? [Any]{ 
     for item in okJSON { 
      let infoDictionary = item as! [String:String] 
      if let activityid  = infoDictionary["ActivityID"] 
      { 
       newJob.ActivityID=activityid 
       print(activityid) 
       print(newJob.ActivityID) 
      } 

      if let companyname  = infoDictionary["CompanyName"] {newJob.CompanyName=companyname} 
      if let quantity   = infoDictionary["Quantity"] {newJob.Quantity=quantity} 
      if let coupontitle  = infoDictionary["Title"] {newJob.CouponTitle=coupontitle} 
      if let couponterms  = infoDictionary["Terms"] {newJob.CouponTerms=couponterms} 
      if let expirdate  = infoDictionary["ExpirDate"] {newJob.ExpirDate=expirdate} 
      if let contactperson = infoDictionary["ContactPerson"] {newJob.ContactPerson=contactperson} 
      if let tel    = infoDictionary["TEL"] {newJob.TEL=tel} 

      joblist.append(newJob) 
     } 
     print(joblist) 
    } 
} 

:構造体のプロパティもoptionalsとして宣言されている場合

3 
Optional("3") 
2 
Optional("2") 
1 
Optional("1") 
[cateringhk.Job(ActivityID: Optional("3"), CompanyName: Optional("ABC\351\233集\351\233集\345\351\233集\345\345\234團"), Quantity: Optional("5"), CouponTitle: Optional("$30現金卷"), CouponTerms: Optional("消費滿$100可以使用\r\n台灯固定环E27灯头 \r\n黑色白色固定扣 \r\n台灯灯罩床头灯具固定环配件 \r\n[交易快照]"), ExpirDate: Optional("2017-11-24"), ContactPerson: Optional("陳先生"), TEL: Optional("96855000")), cateringhk.Job(ActivityID: Optional("2"), CompanyName: Optional("皇上皇點心集團"), Quantity: Optional("31"), CouponTitle: Optional("$30現金卷"), CouponTerms: Optional("消費滿$100可以使用"), ExpirDate: Optional("2017-11-24"), ContactPerson: Optional("陳先生"), TEL: Optional("96855000")), cateringhk.Job(ActivityID: Optional("1"), CompanyName: Optional("八樂園酒樓"), Quantity: Optional("22"), CouponTitle: Optional("$20消費券"), CouponTerms: Optional("每1帳單只可以使用一用一\345\274張消費券"), ExpirDate: Optional("2017-11-24"), ContactPerson: Optional("陳小姐"), TEL: Optional("94567821"))] 

答えて

2

この動作は正常です。この場合、オプションのバインディングを使用したアンラッピングは実際には効果がありません。

それは非オプションとしてプロパティを宣言避け、例えば

struct Job { 

    var activityID = "" 
    ... 

} 

    newJob.activityID = infoDictionary["ActivityID"] ?? "" 

をデフォルト値を代入するのではなく、空の文字列を割り当てるには、二回面倒になります。辞書を取り、定数としてプロパティを宣言し、initメソッドのデフォルト値を処理するために、構造体にイニシャライザを追加します。

struct Job { 

    let activityID : String 
    ... 

    init(dict: [String:String]) { 
     activityID = dict["ActivityID"] ?? "" 
     ... 
    } 

} 

注:

変数名は小文字で開始することを命名規則に準拠してください