无法推断类型
Posted
技术标签:
【中文标题】无法推断类型【英文标题】:Could not infer type for 【发布时间】:2018-01-03 08:30:37 【问题描述】:我正在创建一个 Web API 来从服务器获取数据并使用 AlamoFire 和 SwiftyJSON。
为什么会出现错误“Could not infer type for i) 在其自身类型中使用的“地址” ii) 使用未解析的标识符“userAddress(addressJSON:)” " 请帮我解决这个错误?
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
【问题讨论】:
【参考方案1】:首先,结构和类名应该以大写字母开头
您的代码暗示 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 解析为结构的功能。整个代码可以大大减少。以上是关于无法推断类型的主要内容,如果未能解决你的问题,请参考以下文章
在 Kotlin 中无法“findViewById”。收到错误“类型推断失败”