Ios 无法推断的类型
我正在创建一个Web API来从服务器获取数据,并使用AlamoFire和SwiftyJSON 为什么会出现错误“无法推断 i) 在其自身类型中使用的“地址” ii)使用未解析标识符“userAddress(addressJSON:)” " 请帮助我如何解决此错误Ios 无法推断的类型,ios,swift,rest,alamofire,swifty-json,Ios,Swift,Rest,Alamofire,Swifty Json,我正在创建一个Web API来从服务器获取数据,并使用AlamoFire和SwiftyJSON 为什么会出现错误“无法推断 i) 在其自身类型中使用的“地址” ii)使用未解析标识符“userAddress(addressJSON:)” " 请帮助我如何解决此错误 import Foundation import SwiftyJSON class user { var name = String() var uname = String() var email = S
import Foundation
import SwiftyJSON
class user {
var name = String()
var uname = String()
var email = String()
var phone = String()
var address = userAddress?()
var company = userCompany?()
init(userJSON : JSON) {
self.name = userJSON["name"].stringValue
self.uname = userJSON["username"].stringValue
self.phone = userJSON["phone"].stringValue
self.email = userJSON["email"].stringValue
self.address = userAddress(addressJSON:userJSON["address"])
self.company = userCompany(companyJSON:userJSON["company"])
}
}
class userAddress {
var street = String()
var city = String()
init(addressJSON: JSON) {
self.street = addressJSON["street"].stringValue
self.city = addressJSON["city"].stringValue
}
}
class userCompany {
var companyName = String()
var phrase = String()
init(companyJSON: JSON) {
self.companyName = companyJSON["name"].stringValue
self.phrase = companyJSON["catchPhrase"].stringValue
}
}
首先,结构和类名应该以大写字母开头 您的代码意味着JSON提供了所有值,因此没有选项 如果有初始值设定项,则使用默认值声明属性是一个非常坏的习惯。声明
var name:String
非常好
class User {
var name : String
var uname : String
var email : String
var phone : String
var address : UserAddress
var company : UserCompany
init(userJSON : JSON) {
self.name = userJSON["name"].stringValue
self.uname = userJSON["username"].stringValue
self.phone = userJSON["phone"].stringValue
self.email = userJSON["email"].stringValue
self.address = UserAddress(addressJSON:userJSON["address"])
self.company = UserCompany(companyJSON:userJSON["company"])
}
}
class UserAddress { ...
class UserCompany { ...
注:
在Swift 4中,JSONDecoder比SwiftyJSON方便得多。你能解释更多吗?声明这个
var name=String
而不是var name=String()
?如果在init
方法中分配了属性的初始值,那么只声明类型就足够了(建议这样做)。它满足规则类和结构必须在创建该类或结构的实例时将其所有存储属性设置为适当的初始值。您甚至可以将属性声明为常量let name:String
@vadian为什么这样认为?在Swift 4中,JSONDecoder比SwiftyJSON@NazmulHasan因为在使用JSONDecoder
时,将JSON解析为结构是内置的。整个代码可以大大减少。