项目名称:Arrow
Arrow是一个用于Swift语言的开源框架,旨在简化JSON数据到模型对象的映射过程。它通过一个简洁的箭头操作符<--
来减少模板代码,提高代码的可读性和可维护性。以下是该项目的主要特点和使用方法:
特点
类型推断:Arrow能够推断出JSON字段对应的Swift类型,减少显式类型转换。
模型清洁:使用Arrow,模型类中无需额外的初始化方法或解析代码。
自定义和嵌套模型:Arrow支持自定义转换和嵌套模型的解析。
点和数组语法:支持点表示法和数组语法来访问JSON中的嵌套数据。
纯Swift、简单且轻量级:Arrow完全用Swift编写,无额外依赖,易于集成和使用。
示例
以下是使用Arrow前后的代码对比:
Swift模型
struct Profile {
var identifier = 0
var name = ""
var link:NSURL?
var weekday:WeekDay = .Monday
var stats = Stats()
var phoneNumbers = [PhoneNumber]()
}
JSON文件
{
"id": 15678,
"name": "John Doe",
"link": "https://apple.com/steve",
"weekdayInt" : 3,
"stats": {
"numberOfFriends": 163,
"numberOfFans": 10987
},
"phoneNumbers": [{
"label": "house",
"number": "9809876545"
}, {
"label": "cell",
"number": "0908070656"
}, {
"label": "work",
"number": "0916570656"
}]
}
使用Arrow之前
var profile = Profile()
if let id = json["id"] as? Int {
profile.identifier = id
}
if let name = json["name"] as? String {
profile.name = name
}
if let link = json["link"] as? String, url = NSURL(string:link) {
profile.link = link
}
if let weekdayInt = json["weekdayInt"] as? Int, weekday = WeekDay(rawValue:weekdayInt) {
profile.weekday = weekday
}
if let statsJson = json["stats"] as? AnyObject {
if let numberOfFans = statsJson["numberOfFans"] as? Int {
profile.stats.numberOfFans = numberOfFans
}
if let numberOfFriends = statsJson["numberOfFriends"] as? Int {
profile.stats.numberOfFriends = numberOfFriends
}
}
if let pns = json["phoneNumbers"] as? [AnyObject] {
for pn in pns {
phoneNumbers.append(PhoneNumber(json: pn))
}
}
使用Arrow之后
extension Profile:ArrowParsable {
mutating func deserialize(_ json: JSON) {
identifier <-- json["id"]
link <-- json["link"]
name <-- json["name"]
weekday <-- json["weekdayInt"]
stats <- json["stats"]
phoneNumbers <-- json["phoneNumbers"]
}
}
用法
let profile = Profile()
profile.deserialize(json)
安装
Arrow支持通过Swift Package Manager安装。其他包管理器(如Carthage和CocoaPods)在版本5.1.2之后已不再支持。
Swift Package Manager
在Xcode中,选择File
> Swift Packages
> Add Package Dependency...
,然后粘贴Arrow的GitHub地址。