美文网首页
谈谈Swift与Objective-C混编

谈谈Swift与Objective-C混编

作者: kamto | 来源:发表于2017-08-14 16:27 被阅读26次

    在实际项目的工程中,Swift与Objective-C文件都可以无缝结合。

    Swift工程里使用Objective-C文件

    当在Swift工程中新建Objective-C文件,Xcode会提示是否创建Bridging Header桥接头文件,如下图所示

    点击创建,Xcode会自动创建一个名为MyProject-Bridging-Header.h的桥接头文件,其中MyProject为工程名字

    MyProject-Bridging-Header.h实质上是一个供swift使用的头文件,在这里把所有要暴露给swift的oc头文件都添加进去,这样写swift的时候就可以直接使用那些oc的类和方法。

    例如,创建一个OCModel的类

    OCModel.h

    #import <Foundation/Foundation.h>
    
    @interface OCModel : NSObject
    @property (nonatomic, strong) NSString *name;
    @end
    
    

    也可以自己创建一个桥接头文件,然后需要在Building Settings中Objective-C bridging Header 添加该桥接文件的路径,如下图所示

    在Test-Bridging-Header.h中导入所用到的Objective-C文件,如下图所示

    点击Generated Interface后可以看到Objective-C转换为Swift后的Public接口,如下图所示

    我们来试着调用OCModel这个类

        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            let model = OCModel.init()
            model.name = "joe"
            print("\(model.name!)")
            
        }
    

    是不是很简单呢

    Objective-C工程里使用Swift文件

    在Objective-C工程里创建一个swift文件,如

    如果提示是否创建桥接文件,如下图所示

    BA622B43-4AE9-4C4B-92B7-D10FEBB733EA.png

    选择Don‘t Creat,因为swift本身没有头文件,只有.swift,所以不需要这个桥接文件引用声明文件。

    SwiftModel.swift

    import UIKit
    
    public class SwiftModel: NSObject {
        public var name = String()
        public func log() {
             print("\(name)")
        }
    }
    
    

    如果Swift类想要被OC发现,必须继承自NSObject并且使用public标记,并且该类中想要被OC访问的方法也必须使用public标记。

    当Objective-C项目中至少创建一个swift文件时,会自动生成一个Myproject-Swift.h文件,它定义了项目中所有的Swift文件,这个文件在工程目录上并不能找到,但是command加左键就能看到这个文件中的导入的Swift文件对外公开的属性或者方法,如下图:

    然后在需要用到swift文件的地方导入#import "MyProject-Swift.h"

    MyProject为工程名称

    ViewController.h

    #import "ViewController.h"
    #import "MyProject-Swift.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        SwiftModel *model = [[SwiftModel alloc]init];
        model.name = @"joe";
        [model log];
        
    }
    @end
    

    如果编译器会红色报错,编译一下就好了。

    swift版本 Generated by Apple Swift version 3.0.2

    相关文章

      网友评论

          本文标题:谈谈Swift与Objective-C混编

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