OC
项目向 Swift
转型中选择了 HandyJson
作为解析 Json
的工具库,发现使用了 HandyJson
后,一些 OC
类解析不了。
OCModel
是一个OC类。
/// OCModel.h
@interface OCModel : NSObject
@property (nonatomic,copy) NSString *userid;
@property (nonatomic,copy) NSString *memberid;
@end
UserModel
是 Swift
业务类。
/// 这个是我们的业务类
class UserModel: HandyJSON {
/// 成员列表, OCModel 是通过桥接的 OC类
public var memberlist: [OCModel]?
}
结果发现 memberlist
会转换失败。
研究了一下HandyJson
框架,发现提供了这样的协议:
public protocol HandyJSONCustomTransformable: _ExtendCustomBasicType {}
public protocol HandyJSON: _ExtendCustomModelType {}
public protocol HandyJSONEnum: _RawEnumProtocol {}
/// _RawEnumProtocol
public protocol _RawEnumProtocol: _Transformable {
static func _transform(from object: Any) -> Self?
func _plainValue() -> Any?
}
extension RawRepresentable where Self: _RawEnumProtocol {
public static func _transform(from object: Any) -> Self? {
if let transformableType = RawValue.self as? _Transformable.Type {
if let typedValue = transformableType.transform(from: object) {
return Self(rawValue: typedValue as! RawValue)
}
}
return nil
}
public func _plainValue() -> Any? {
return self.rawValue
}
}
所以你可以这样:
创建一个 swift
类,继承 OCModel
class Swift_OCModel: OCModel,HandyJSON,HandyJSONEnum {
/// HandyJSONEnum 协议方法
public func _plainValue() -> Any? {
/// YYModel 的方法(可变更自己的)
return self.modelToJSONObject()
}
static func _transform(from object: Any) -> Self? {
/// YYModel 的方法(可变更自己的)
let model = Swift_OCModel.model(withJSON: object)
return model as? Self
}
required override init() {
super.init()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
然后,memberlist: [OCModel]?
-> memberlist: [Swift_OCModel]?
,就可以正常解析了。
/// 这个是我们的业务类
class UserModel: HandyJSON {
/// 成员列表, OCModel 是通过桥接的 OC类
// public var memberlist: [OCModel]?
public var memberlist: [Swift_OCModel]?
}