我有一个函数来获取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"))]
答案 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
注意:
请遵守变量名称以小写字母
开头的命名约定