2015-11-13 10:06:44 lvdezhou 阅读数 1579

1、oc工程调用swift-----自动创建桥接头文件

创建一个oc工程:


设置Product Module Name = 工程名



创建一个swift文件:

点击自动创建桥接头文件:



设置Objective-C Bridging Header 如下图:



至此,我们可以在oc中调用swift了

测试代码:


import Foundation

class Student: NSObject {
    var name : String = "dzl"
    var age : Int = 22
}

在oc中引入头文件  "工程名-swift.h" 就可以使用swift中的类了

注:这个头文件是不可见的

#import "ViewController.h"

#import "OCuseSwift1-swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Student * s1 = [[Student alloc] init];
    NSLog(@"%@", s1.name);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

输出:

2015-11-13 10:01:32.250 OCuseSwift1[1040:20007] dzl

此时swift也是可以引用OC的,只需将swift需要使用的oc类头文件在桥接头文件中引入即可,






2、oc工程调用swift-----手动创建桥接头文件


首先创建一个oc工程,与上面相同

然后创建一个swift文件,但是不选择创建桥接头文件,如图:



然后手动创建桥接头文件,就相当于创建一个普通的头文件一样,只是命名一定要严格按照规则:



工程设置中指定桥接头文件:


经测试,oc引用swift或者swift引用oc都是可以的,测试方法与上面相同,这里不再赘述。



3、swift工程调用-----自动创建桥接头文件 和 手动创建桥接头文件,基本与上面操作一直,不再详述




其实桥接头文件里面引入oc头文件,是为了swift可以访问oc文件,

在oc中引入   工程名-swift.h   文件  是为了oc可以访问swift,但这个文件是不可见的,不过可以通过command+鼠标左键查看该文件



2019-03-25 14:27:53 lfdanding 阅读数 82

最近在oc工程里要引用swiftMonkeypaws,需要使用oc调用swift技术,里面踩了很多坑,这里简单记录一下。

1、oc调用swift

oc调用swift其实很简单,google一下就有很多的教程,可以参考文章1、2、3、4。总体上就是在要调用swift代码的时候,引入头文件 “模块名-Swift.h”,这个头文件对外不可显示,需要手动导入。可以在 Build setting 中查看:
在这里插入图片描述
现在我们在 OC 中添加这个头文件:
在这里插入图片描述
我们需要查看一下swift到底可以调用那些方法和类。这个时候,我们可以点进这个头文件中去。进入头文件往下拉,可以看到暴露出来的 Swift 的类名和方法:
在这里插入图片描述

2、oc调用swift ,涉及cocoapods

上面完全是主工程里使用当然毫无难度,但是我要引入的swiftMonkeypaws是要以cocoapods方式进行引入,这里面就有很多的问题。

2.1 引入头文件名字不一样

头文件要引入的格式为 #import <产品名/模块名-Swift.h>,参考文章5,我们可以在 Build Settings 中查看:
在这里插入图片描述
2.2、头文件引入的位置
头文件如果引用在pods工程的起点文件中,还是会报找不到头文件的错误,这里面我没有深入研究pods工程的编译原则,但是不难猜出因为是在pods工程的起点文件中,还没有开始编译pod工程里的swift文件,所以就没有生成oc调用swift的接口文件,导致头文件找不到。我这边的临时解决办法就是把头文件引用移动到了其他的位置
在这里插入图片描述

3、oc引用swiftMonkeypaws

oc引用swiftMonkeypaws,网上的文章也很多,可以参考文章6、7、8、9、10。对于参考文章8,矫正一下

var paws: MonkeyPaws?

class MonkeyUIPaws: NSObject 
{        
    @objc public func showMonkeyPawsINUITest ( window: UIWindow ) -> () {
        paws = MonkeyPaws(view: window)    
    }

     @objc class func test() -> () {
        print("test")
    }
}

如果不这么修正,你会收到 unrecognized selector sent to instance,主要原因是因为把MonkeyPaws设置成局部变量以后,这个界面释放以后,MonkeyPaws也被释放,再调用MonkeyPaws的方法就会引发这个错误。所以要把MonkeyPaws设置到类外面。对于unrecognized selector sent to instance这个错误的详细描述可以参考文章11、12。

参考文章:

1、https://blog.csdn.net/studying_ios/article/details/70146879
2、https://www.jianshu.com/p/754396e7e1bd
3、https://www.jianshu.com/p/9f757a09eacd
4、https://www.jianshu.com/p/979ff6350cb6
5、https://zhang759740844.github.io/2017/07/05/Swift%E5%92%8COC%E7%9A%84%E6%B7%B7%E7%BC%96%E5%AE%9E%E8%B7%B5/
6、http://www.php-master.com/post/151913.html
7、https://www.jianshu.com/p/34bf481d5c13
8、https://www.jianshu.com/p/b763b65005bd
9、https://gysxl.github.io/2017/11/03/%E5%9F%BA%E4%BA%8EXCUITest%E8%BF%9B%E8%A1%8C%E7%9A%84iOSMonkey%E6%B5%8B%E8%AF%95/
10、http://www.php-master.com/post/151913.html
11、https://moto0421.iteye.com/blog/1570876
12、https://juejin.im/entry/58eddde3570c350057f2b975

2015-11-14 11:30:12 Xiao_Long_Li 阅读数 1594

OC调用Swift


如果你想在Objective-C工程中,嵌入Swift文件,实现OC调用Swift,那么这篇文章就能帮助你,由于本人最近在开发Swift项目,所以实现过OC调用Swift,在这过程中遇到过一些瓶颈,特此,将此文奉上,供大家参考。

OC调用Swift文件,需要创建桥接头文件,这个文件是当你在OC开发环境中创建Swift文件时由Xcode生成,该桥接头文件的命名是:<工程名>-Bridging-Header.h,它的作用是实现OC和Swift文件混编,并且如果我们想在当前OC类中调用Swift文件,必须在当前OC类中包含头文件,它的命名是:<工程名>-Swift.h,该头文件是由Xcode本身去维护,当我们点击进入到该头文件时,会看到Swift文件被编译成了OC封装的接口。

下面让我们来通过一个小Demo,进一步了解如何实现OC调用Swift。


第一步:创建OC工程

启动Xcode 7.1,然后单击File→New→Project菜单,在打开的Choose atemplate for your new project界面中选择“iOS →Application→Single View Application”工程模板(如下图所示)。


选中Single View Application单击“Next”,会出现如下图所示



这里我们将工程名命名为OCCallSwift,单击“Next”,就会出现下图所示的界面


单击“Create”,这时我们的OC工程就创建好了。

接下来我们创建一个OC的类,类名为OCViewController,具体怎么创建就不详细说了。


第二步:在OC工程中添加Swift文件


在当前OC工程中,创建Swift文件,如下图所示:


选中Cocoa Touch Class,点击“Next”,此时会跳到下图:


这里我们将Swift文件命名为SwiftViewController,将Language设置为Swift,单击“Next”,跳到下图:


这时单击“Creat”,就会弹出“Would you like to configure an Objective-C bridging header?”,如下图所示


单击“Create Bridging Header”,这时我们就在OC工程中创建好了一个Swift文件,如下图所示



第三步:实现OC调用Swift

这里我们就简单实现一下在OC类中跳转到Swift文件中

1)在OC类中包含头文件

#import <OCCallSwift-Swift.h>,命名规则为:<工程名>-Swift.h,如下图所示


2)在OC类中调用Swift文件,跟OC类调用OC类实现方式一样,如下图所示:



这样我们就实现了OC调用Swift。


友情提示:1.以上的代码是在Xcode7.1中实现,并且是新工程;

2.必须创建桥接头文件(“Create Bridging Header);

3.必须在调用Swift文件的OC类中包含如下头文件:<工程名>-Swift.h

4.如果以上条件全部符合,但是你在一个老的OC应用中调用Swift,有可能出现下面情况'<工程名>.Swift' file not found,这时你就应该在Xcode中的Build Setting中找到"Defines module",将其改为Yes


特别说明:1. 以上Swift文件均指Swift类;

  2. Swift语言为Swift2.0版本。


著作权声明:本文为原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢

2017-05-23 12:15:55 SharkToping 阅读数 529

一、在OC文件中调用Swift代码需要导入一个#import <工程名-Swift.h>的头文件、该文件编译一下就会由系统创建,并且是不可见的。

二、有‘工程名-Bridging-Header’这样的头文件

     该文件是自动创建的在swift中调用OC代码使用的桥接文件,需要将在Swift中使用的OC的相关头文件添加在此处,

如没有该文件则需要如下操作:

1、手动创建一个头文件(名称不限)。

2、在Build Settings中搜索Objective-C Bridging Header。

3、将该文件相对于工程的路径填入该项。


2016-12-15 15:53:53 u012243474 阅读数 329

oc调用swift的设置方法如下:


  1、确保将框架 target 的 Build Settings > Packaging > Defines Module 设置为 Yes


  2、将 build setting 中的 Product Module Name 修改为工程名。


  之后的项目会自动生成swift的头文件头文件名称为Product Module Name-Swift.h (Product Module Name为工程名)

  所有的swift都会在这个头文件里


接下来直接调用方法就可以了,不再需要引入相关头文件了

OC调用Swift方法

阅读数 5637

OC调用Swift

阅读数 5

没有更多推荐了,返回首页