一個小問題 :Swift 與 OC 混編 HandyJson 解析 OC 類的辦法

語言: CN / TW / HK

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

```

UserModelSwift 業務類。

```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]? } ```