You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

混合Swift与Objective-C项目中,如何在Objective-C中使用SwiftyJSON?

在Objective-C中使用SwiftyJSON的解决方案

嗨,刚好我之前处理过类似的Swift/Objective-C混编场景,给你一步步拆解怎么在OC里用上SwiftyJSON:

1. 先确认SwiftyJSON已正确集成

如果你用CocoaPods管理依赖,先检查Podfile里有没有这一行:

pod 'SwiftyJSON'

执行pod install后,确保项目能正常编译Swift代码,没有报错。

2. 写一个Swift封装层(核心步骤)

SwiftyJSON的原生类是Swift-only的,没有暴露给Objective-C接口,所以我们需要自己写一个中间封装类,把SwiftyJSON的功能转换成OC能调用的方法。

新建一个Swift文件(比如叫SwiftyJSONWrapper.swift),代码如下:

import Foundation
import SwiftyJSON

@objc class SwiftyJSONWrapper: NSObject {
    private var json: JSON
    
    // 从Data初始化JSON
    @objc init(data: Data) {
        json = JSON(data: data)
        super.init()
    }
    
    // 从字典初始化JSON
    @objc init(dictionary: [String: Any]) {
        json = JSON(dictionary)
        super.init()
    }
    
    // 获取字符串类型的值
    @objc func string(forKey key: String) -> String? {
        return json[key].string
    }
    
    // 获取整数类型的值
    @objc func int(forKey key: String) -> Int? {
        return json[key].int
    }
    
    // 获取布尔类型的值
    @objc func bool(forKey key: String) -> Bool? {
        return json[key].bool
    }
    
    // 获取嵌套的JSON对象(返回封装后的实例)
    @objc func nestedJSON(forKey key: String) -> SwiftyJSONWrapper? {
        let nested = json[key]
        guard nested.type != .null, let dict = nested.dictionary else {
            return nil
        }
        return SwiftyJSONWrapper(dictionary: dict)
    }
    
    // 获取JSON数组(返回封装实例的数组)
    @objc func jsonArray(forKey key: String) -> [SwiftyJSONWrapper]? {
        let array = json[key].arrayValue
        return array.compactMap {
            guard let dict = $0.dictionary else { return nil }
            return SwiftyJSONWrapper(dictionary: dict)
        }
    }
    
    // 可以根据自己的需求扩展更多方法,比如double、array count等
}

⚠️ 注意:这个类必须继承NSObject,所有要给OC调用的方法/属性都要加@objc修饰,不然OC识别不到。

3. 确保OC能访问到这个Swift类

  • 如果你的项目还没有桥接文件,Xcode会在你创建第一个Swift文件时自动提示生成,确认生成即可(通常命名为[你的项目名]-Bridging-Header.h)。
  • 不需要在桥接文件里导入这个封装类,Xcode会自动把带@objc的Swift类打包到[你的项目名]-Swift.h头文件里。

4. 在Objective-C中调用封装类

现在你可以在OC类里导入项目的Swift头文件,然后直接使用封装好的功能了:

#import "YourProjectName-Swift.h"

// 示例:从网络数据解析JSON
NSURL *url = [NSURL URLWithString:@"https://example.com/api/user"];
NSData *jsonData = [NSData dataWithContentsOfURL:url];
SwiftyJSONWrapper *jsonWrapper = [[SwiftyJSONWrapper alloc] initWithData:jsonData];

// 获取用户名
NSString *username = [jsonWrapper stringForKey:@"username"];
NSLog(@"用户名: %@", username);

// 获取用户年龄
NSNumber *age = [jsonWrapper intForKey:@"age"];
NSLog(@"年龄: %@", age);

// 获取嵌套的地址信息
SwiftyJSONWrapper *addressWrapper = [jsonWrapper nestedJSONForKey:@"address"];
NSString *city = [addressWrapper stringForKey:@"city"];
NSLog(@"城市: %@", city);

一些注意事项

  • 如果需要更多SwiftyJSON的特性(比如判断空值、处理错误),可以在封装类里扩展对应的方法,比如加一个@objc func isNull(forKey key: String) -> Bool。
  • 要是遇到OC找不到SwiftyJSONWrapper的情况,先清理项目(Command+Shift+K)再重新编译(Command+B)试试。
  • 确保你的Swift代码没有编译错误,否则[项目名]-Swift.h不会生成正确的接口。

内容的提问来源于stack exchange,提问作者Umar Afzal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:50:19