oc 引用swift 类

2019-05-07 11:35:12 Bolted_snail 阅读数 551
  • 最近在一个混编项目中,一个OC类需要去访问一个Swift类,访问其他Swift类都可以,但就没法访问报以下错误:
    报错
  • 点进去看发现该类型是个结构体,如下所示:
    在这里插入图片描述在这里插入图片描述
  • 解决方案:因为Swift的结构体除了不能继承外可以有自己的成员变量和方法,就是一个不能继承的类.所以我将struct改成了class,结果还是不行.后来就像因为Swift中的类可以没有父类,而OC的中有基类的,所有类都最终继承至NSObject,所以就将该CTPCarVideoUploadInfoModel也继承NSObject,果然改完后再OC中就可以访问该类型了.改完后如下:
     class CTPCarVideoUploadInfoModel:NSObject{
     }
    
2017-08-10 13:40:37 qq_33298465 阅读数 4995

有时候 ,我们会涉及到双向混合编程,特别是OC和swift的互相引用。

 

swift调用oc的方法:

1、桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可)

2、将需要引用的oc文件 .h头文件 添加到桥接类中。

 

如下:

然后在swift调用处,直接就可以使用了。

 

oc调用swift的方法:

1、首先设置一下Packing

进入TARGETS ->Build Settings -> Packaging 中

设置Defines Module为YES

设置 Product Module Name (这个也可以不设置,直接使用默认就行)

如图:

 

 2、设置完之后,在需要引用的oc文件头部  import一下,格式为: #import "工程名-Swift.h"

      比如:#import "OrderSystem-Swift.h"

 

然后就可以使用swift文件了

 

对了,本文是基于swift创建的工程,两种情况分别对应正常的 swift引用oc文件,以及在oc文件内回头引用swift文件。

如果是基于oc创建的工程,暂未测试。

2017-03-17 13:51:27 u010407865 阅读数 21734

网上有很多关于OC项目中使用Swift类的方法,但是亲自试了之后,发现不够详细,多次尝试后,终于找出详细的方法。
现把方法和遇到的问题,记录下来,方便其他同仁借鉴:

一、新建一个OC工程,工程名称自定,在这里我定义为OCAndSwiftDemo,如图:

新建项目架构图

二、在新建Swift类之前,进行相关设置,如图:

相关设置

三、在项目中,新建一个TestDemo的swift类,点击Create后,提示如图:

创建OC调用Swift类的桥接文件

选择Create Bridging Header,一定要选择这个,如果不选择,就引入不了Swift类,然后生成”项目名称-Bridging-Header.h”桥接文件

然后编辑Swift类,如果Swift类想要被OC发现,必须继承自NSObject,如图:

TestDemo类

四、调用Swift类,我们想要调用Swift类的方法里面引入头文件:”项目名称-Swift.h”,如图:

调用Swift类

注释:如果调用不了Swift类,可以先Shift+Command+R一下。

2017-04-12 14:35:21 cordova 阅读数 1459

OC和Swift之间的互调很简单,iOS8以后官方给出了这两种语言之间的桥接方案,简单说就是在Swift工程中,通过提示创建的Bridging头文件可以将OC文件和Swift文件衔接在一起,从而可以在OC文件中引用Swift类,或者在Swift文件中引用OC的类。应用较多的主要是在Swift中调用OC类,使得在最新的swift工程中仍然能够兼容使用以前的OC类库等。

这里通过一个简单的例子展示在Swift工程中OC和Swift之间的互调:

首先建立一个Swift工程,这里创建了一个Single View Application,工程名为SwiftBridge,并分别新建了一个新的名为SwiftClass的swift类文件和一个名为OCClass的OC类文件,创建第一个OC文件后会提示创建一个Bridging头文件,创建后就可以对两者进行桥接:

这里我们在ViewController.swift中调用OCClass类,同时在OCClass类中调用SwiftClass.swift。其中在swift中引用OC类时要在Bridging头文件中引入OC类的头文件(swift文件中没有头文件及其引用),而在OC中引用swift类时直接引入“SwiftBridge-swift.h”即可,不需要在Bridging头文件设置,其中“SwiftBridge”为工程名,该文件是隐藏的,对工程中所有swift类文件进行了向OC语言的翻译,从而在OC文件中可以像调用其他OC文件一样调用工程中的swift类文件。

  1. 在SwiftClass.swift中定义一个实例方法和一个类方法:
import UIKit

class SwiftClass: NSObject {
    func SwiftInstanceMethod() -> Void {
        print("swift instance method!");
    }
    class func SwiftClassMethod() -> Void {
        print("swift class method!");
    }
}
  1. 在OCClass类中调用SwiftClass:
/* OCClass.h */
#import <Foundation/Foundation.h>

@interface OCClass : NSObject
- (void)OCInstanceMethod;
+ (void)OCClassMethod;
@end

/* OCClass.m */
#import "OCClass.h"
#import "SwiftBridge-swift.h" /* 引入swift类头文件 */

@implementation OCClass
- (void)OCInstanceMethod {
    /* 调用swift实例方法 */
    SwiftClass *swiftc = [[SwiftClass alloc] init];
    [swiftc SwiftInstanceMethod];
    NSLog(@"oc instance method!");
}
+ (void)OCClassMethod {
    /* 调用swift类方法 */
    [SwiftClass SwiftClassMethod];
    NSLog(@"oc class method!");
}
@end
  1. 在Bridging头文件引入OC类头文件供swift调用:
/* SwiftBridge-swift.h */
#import "OCClass.h"
  1. 在ViewController.swift中调用OCClass类:
/* ViewController.swift */
import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let occ = OCClass()
        occ.ocInstanceMethod()
        OCClass.ocClassMethod()
    }
}

打印结果:

swift instance method!
2017-04-12 12:40:39.657 SwiftBridge[3773:5420107] oc instance method!
swift class method!
2017-04-12 12:40:39.657 SwiftBridge[3773:5420107] oc class method!

另外类似的也可以实现swift和C语言之间的互调。

2017-05-04 14:41:18 allanGold 阅读数 1120

一、OC调用swift文件

  在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定创建桥接文件,Xcode会自动创建一个桥接文件

名字:工程名-Bridging-Header.h

这个桥接文件是 swift 调用OC文件的时候用的

1、

  进入TARGETS ->Build Settings -> Packaging 中

设置Defines Module为YES

设置 Product Module Name ,也可以不设置,默认为工程的名字。这个在后面会用到

2、

  在swift写一个类

注意这个类一定要继承NSObject,不然在OC中没法用

class hello: NSObject {

    var address : String
    var gender: String
   
    init(address:String,gender:String){
        self.address = address
        self.gender = gender
    }
   
    func method() {
        print("message \(self.address + self.gender)")
    }
}

3、

  在OC需要用到的swift文件中 导入文件 "Product Module Name -Swift.h"  因为 Product Module Name 默认是工程的名字

所以直接导入 #import "工程名-Swift.h"

4、

  记着写完先command +B编译一下,如果没有报错就可以在OC文件调用swift中的类了

hello *helloss = [[helloalloc]initWithAddress:@"上海"gender:@"男"];
[helloss method];

iOS oc 调用 swift

阅读数 533

OC与swift相互调用

阅读数 2370