一個小問題 :Swift 與 OC 混編 HandyJson 解析 OC 類的辦法
OC
專案向 Swift
轉型中選擇了 HandyJson
作為解析 Json
的工具庫,發現使用了 HandyJson
後,一些 OC
類解析不了。
OCModel
是一個OC類。
```c /// OCModel.h
@interface OCModel : NSObject
@property (nonatomic,copy) NSString userid; @property (nonatomic,copy) NSString memberid;
@end
```
UserModel
是 Swift
業務類。
```c /// 這個是我們的業務類 class UserModel: HandyJSON {
/// 成員列表, OCModel 是通過橋接的 OC類
public var memberlist: [OCModel]? } ```
結果發現 memberlist
會轉換失敗。
研究了一下HandyJson
框架,發現提供了這樣的協議:
```c 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
````c
class Swift_OCModel: OCModel,HandyJSON,HandyJSONEnum {
/// HandyJSONEnum 協議方法
public func _plainValue() -> Any? {
return self } 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]?
,就可以正常解析了。
```c /// 這個是我們的業務類 class UserModel: HandyJSON {
/// 成員列表, OCModel 是通過橋接的 OC類
// public var memberlist: [OCModel]? public var memberlist: [Swift_OCModel]? } ```