美文网首页iOS开发精进程序员iOS Developer
创建用到OC Framework的Swift Framework

创建用到OC Framework的Swift Framework

作者: huhueggtest_tdp | 来源:发表于2016-08-26 14:20 被阅读1922次

    遇到的问题

    平时很熟悉在Swift工程中使用Objective-C的方法,一个桥接头文件就搞定了。在写Swift Framework的时候很自然的就是先随意创建个oc文件,等待弹出是否需要自动创建桥接文件的提示。没出现! 手动添加也不生效!

    那么如何在Swift的framework中使用OC的framework呢?
    刚踩完坑,留个demo。

    创建OC Framework

    OCFramework

    为swift framework调用做配置

    1. 需要把给Swift调用的TestOCFramework.h添加到OCFramework.h中
    此处添加需要被SwiftFramework访问的.h
    1. 设置OCFramework->BuildPhases->Headers
    将TestOCFramework.h移至Public

    TestOCFramework

    TestOCFramework.h

    #import <Foundation/Foundation.h>
    
    @interface TestOCFramework : NSObject
    
    +(NSString *)hello;
    @end
    

    TestOCFramework.m

    #import "TestOCFramework.h"
    
    @implementation TestOCFramework
    +(NSString *)hello {
        return @"Objective-c hello";
    }
    @end
    
    

    创建Swift Framework

    SwiftFramework

    添加OCFramework.framework

    添加OCFramework.framework

    import OCFramework

    添加需要调用的OCFramework的.h

    TestSwiftFramework

    import UIKit
    
    public class TestSwiftFramework: NSObject {
        public class func hello() {
            //测试调用OCFramework
            if let ocHello = TestOCFramework.hello() {
                print("TestSwiftFramework.hello load oc framework: \(ocHello)")
            } else {
                print("TestSwiftFramework load OCFramework failed")
            }
        }
    }
    

    SwiftFramework调用OCFramework就这样完成啦,分别创建OC和Swift的Demo来测试一下。

    TestOCDemo

    创建OC工程测试

    OC测试工程

    添加Framework

    添加使用的Framework

    为SwiftFramwork修改Build Settings

    将Always Embed Swift Standard Libraries设置为Yes

    在AppDelegate调用SwiftFramework试试

    #import "AppDelegate.h"
    
    #import "SwiftFramework/SwiftFramework-Swift.h"
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        //测试调用SwiftFramework
        [TestSwiftFramework hello];
        return YES;
    }
    @end
    

    日志
    TestSwiftFramework.hello load oc framework: Objective-c hello

    TestSwiftDemo

    创建Swift工程测试

    Swift测试工程

    添加Framework

    添加Framework

    在AppDelegate调用SwiftFramework试试

    import UIKit
    import SwiftFramework
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            //测试调用SwiftFramework
            TestSwiftFramework.hello()
            
            return true
        }
      }
    

    日志
    TestSwiftFramework.hello load oc framework: Objective-c hello

    查看Demo源码

    https://github.com/huhuegg/Demo/tree/master/UseOCFrameworkInSwiftFramework

    相关文章

      网友评论

      • ze_jie:大神,请问,swift framework 里面可以用第三方的oc库吗?例如BmobSDK这种库。
        demo里面调用自己的oc framework,我试了是可以,但是用第三方的就失败。
        huhueggtest_tdp:@ze_jie swift framework 里面可以用三方的库,.a可以直接包含,framework需要在工程中Link
      • d17dee4c68e5:请问,如何制作一个基于OC的framework, 在这个framework 中 实现 OC 调用swift ?
        zp秋枫暮霞:@itlijunjie 我试过了不行啊
        itlijunjie:http://stackoverflow.com/questions/24078043/call-swift-function-from-objective-c-class/26756530#26756530

        1) Add @ObjC to Swift class

        2) Add in .m
        #import "(ProjectName)-Swift.h"

        3) Call from .h
        @class SwiftClass;

        4)On SwiftClass
        click "Command" + Left Click (Apple Documantation)

        5) To see "-Swift.h" -> click "Command" + Left Click
      • shuolol:你好 大神 请问 为在OC的frameworks 里面用oc 调用swift 的代码 怎么弄 没有桥接文件 不知道怎么调啊
        itlijunjie:http://stackoverflow.com/questions/24078043/call-swift-function-from-objective-c-class/26756530#26756530
        huhueggtest_tdp:@shuolol #import “<工程名>-swift.h”
      • KayMo:dyld: Library not loaded: @rpath/OCFramework.framework/OCFramework
        /TestSwiftDemo Reason: image not found
      • huhueggtest_tdp:建议Carthage试试
      • 爱尔兰雪:写的很清楚。只是我现在的困难是,pod。pod一个oc轮子到swift fw里,然后再给别的target使用,就会报错,怎么都找不到这个sw fw
      • 669f4f27f444:#import <SwiftFramework/SwiftFramework-Swift.h> 运行可以,但是这里会报红色,could not build module "SwiftFramework", 另外 如何在 OC的framework中使用Swift的framework呢? 反过来一直报错,不能用!!请指教,谢!!
        huhueggtest_tdp:@tonylegend OC的framework直接可以使用Swift的Framework,需要注意设置Build Settings -> BuildOptions -> Embedded Content Contains Swift Code 为Yes
        huhueggtest_tdp:@tonylegend 是不是#include< x/x.h >出现:Could not build module ‘x’ ? 那可能是因为没有将在对外部公开的类中.h引用到的类,放到pulbic里面

      本文标题:创建用到OC Framework的Swift Framework

      本文链接:https://www.haomeiwen.com/subject/kqhzsttx.html