2017-11-13 4 views
0

JSON을 가져 와서 구조체 (작업)에 값을 저장하는 기능이 있습니다. 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) 
    } 
} 

:

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"] ?? "" 
     ... 
    } 

} 

참고 :

변수 이름은 소문자로 시작하는 이름 지정 규칙을 준수하시기 바랍니다