背景
HandyJSON是swift开发中常用的SON解析框架。该库由阿里巴巴技术团队研发,已经过了大量的实战积累。不再赘述。
地址:https://github.com/alibaba/HandyJSON
版本参考
针对不同的IDE环境和Swift版本,HandyJSON的版本也不一样,可以参考下表:
Xcode | Swift | HandyJSON |
Xcode 10 | Swift 4.2 | 4.2.0 |
Xcode 9.4.1以下 | Swift 4 | >= 4.1.1 |
Xcode 8.3以上 | Swift 3.x | >= 1.8.0 |
搜索版本参考如下:
-> HandyJSON (4.2.0)
A Json Serialization & Deserialization Library for Swift
pod 'HandyJSON', '~> 4.2.0'
- Homepage: https://github.com/alibaba/handyjson
- Source: https://github.com/alibaba/HandyJSON.git
- Versions: 4.2.0, 4.2.0-beta1, 4.1.3, 4.1.2, 4.1.1, 4.1.0, 4.0.0-beta.1, 4.0.0-beta, 1.8.0, 1.7.2, 1.7.1, 1.7.0, 1.6.1, 1.6.0, 1.5.2, 1.5.1, 1.5.0, 1.4.0, 1.3.0, 1.2.1,
1.2.0, 1.1.0, 1.0.0, 0.4.0, 0.3.0, 0.2.0, 0.1.0 [master repo]
关于在NumberofFields 报错:
针对不同swift版本HandyJSON一直在更新版本,如果你的HandyJSON版本是1.8.0,swift版本大于3.3并且小于4,可能会在NumberofFields下crash,解决方法有两个:
1.修改库代码(不推荐),将如下代码:
var nominalTypeDescriptor: NominalTypeDescriptor? {
let pointer = UnsafePointer<Int>(self.pointer)
let base = pointer.advanced(by: nominalTypeDescriptorOffsetLocation)
if base.pointee == 0 {
// swift class created dynamically in objc-runtime didn't have valid nominalTypeDescriptor
return nil
}
return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee))
}
修改为:(最后一行)
var nominalTypeDescriptor: NominalTypeDescriptor? {
let pointer = UnsafePointer<Int>(self.pointer)
let base = pointer.advanced(by: nominalTypeDescriptorOffsetLocation)
if base.pointee == 0 {
// swift class created dynamically in objc-runtime didn't have valid nominalTypeDescriptor
return nil
}
return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee - base.hashValue))
}
或者参考官方写法:
var nominalTypeDescriptor: NominalTypeDescriptor? {
let pointer = UnsafePointer<Int>(self.pointer)
let base = pointer.advanced(by: nominalTypeDescriptorOffsetLocation)
if base.pointee == 0 {
// swift class created dynamically in objc-runtime didn't have valid nominalTypeDescriptor
return nil
}
#if swift(>=4.1) || (swift(>=3.3) && !swift(>=4.0))
return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee - base.hashValue))
#else
return NominalTypeDescriptor(pointer: relativePointer(base: base, offset: base.pointee))
#endif
}
2.如果你的swift版本大于3.3并且小于4,升级HandyJSON至对应版本: ~> 4.1.0,如果大于4.0,参照上表升级