代码之家  ›  专栏  ›  技术社区  ›  Eric Chong

swift3可选值问题

  •  0
  • Eric Chong  · 技术社区  · 8 年前

    我有一个函数来获取JSON并将值放入结构(作业)。它打印出变量的值,但没有可选值。但它打印出具有可选值的结构变量。请帮忙解决这个问题。

    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"))]
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   vadian    8 年前

    如果结构中的属性也声明为optionals,则此行为是正常的。在这种情况下,使用可选绑定的展开实际上没有效果。

    为了避免这种情况,请将属性声明为非可选,并指定一个默认值,例如

    struct Job {
    
      var activityID = ""
      ...
    
    }
    
       newJob.activityID = infoDictionary["ActivityID"] ?? ""
    

    但两次分配空字符串看起来很麻烦。我将向结构中添加一个初始值设定项,以获取字典,将属性声明为常量,并处理 init 方法

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

    注:

    请遵守变量名称以小写字母开头的命名约定