swift3可选值问题

时间:2017-11-13 15:56:57

标签: json swift optional

我有一个函数来获取JSON并将值放入struct(Job)中。它打印出的值没有var的可选值。但它打印出struct var with optional。请帮助解决这个问题。

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 个答案:

答案 0 :(得分:2)

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

为避免将该属性声明为非可选属性,并为示例

指定默认值
const result = [], hash = {};

for(const [name, val] of array){
  if( hash[name] ) {
    hash[name][1] += val;
  } else {
    result.push( hash[name] = [name, val] );
  }
}

但是两次分配一个空字符串看起来很麻烦。我将一个初始化器添加到结构中以获取字典,将属性声明为常量并处理struct Job { var activityID = "" ... } newJob.activityID = infoDictionary["ActivityID"] ?? "" 方法中的默认值。

init

注意:

请遵守变量名称以小写字母

开头的命名约定