使用AlamoFire与SwiftyJSON构建Web API时的Swift类型错误解决
关于AlamoFire+SwiftyJSON构建API时的两个错误分析与解决方法
嘿,这两个错误都是Swift类型系统和类声明顺序的常见小坑,我来给你逐个拆解清楚:
错误i:'address'在自身类型中使用时无法推断类型
错误原因
在user类里,你对address和company的声明写法不符合Swift的语法规范:
var address = userAddress?() var company = userCompany?()
这种写法试图直接实例化一个可选类型的实例,但此时userAddress类还没被定义(它在user类的后面),编译器无法推断这个类型;而且正确的可选类型声明也不需要加括号——你只需要指定属性的类型为可选即可,实例化可以放到初始化方法里做。
解决方法
把这两个属性的声明改成明确指定可选类型的写法:
var address: userAddress? var company: userCompany?
错误ii:使用未解析的标识符'userAddress(addressJSON:)'
错误原因
Swift是自上而下编译的语言,当user类的初始化方法里尝试调用userAddress(addressJSON:)时,编译器还没读到后面的userAddress类定义,所以它根本不知道这个标识符是什么。
解决方法
有两种简单的修复方式:
- 调整类的顺序:把
userAddress和userCompany类的定义移到user类的前面,这样编译器处理user类时已经知道这两个类的存在。 - 添加前向声明:在
user类之前先声明这两个类的存在,写法如下:class userAddress; class userCompany;
修正后的完整代码
我结合了调整类顺序+修正可选类型声明的方案,整理出完整的可运行代码:
import Foundation import SwiftyJSON 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 } } 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"]) } }
另外提个小建议:Swift的类名通常采用大驼峰命名法,比如把user改成User、userAddress改成UserAddress,这样更符合Swift的编码规范哦。
内容的提问来源于stack exchange,提问作者Rahul Chopra
相关产品推荐
相关产品推荐

