Swift和Objective-C交互

Swift是对OC的一个优雅的包装,所有的底层库、框架都是使用OC来实习的。所以Swift可以无缝的和Cocoa、OC兼容调用。Swift通过和OC兼容,就可以在Swift程序中大量使用OC API函数。尽管Swift和OC可以相互调用,但是在真实项目中,Swift调用C/C++要常见,因为采用Swift开发,必然要采用大量的稳定的OC开源库

首先,就先来说说Swift是如何调用OC文件的

一、Swift调用OC文件

(1)创建一个Swift项目

Swift和Objective-C交互_第1张图片

(2)在项目中创建一个Objective-C的类Student,记住语言一定要选择OC

Swift和Objective-C交互_第2张图片

(3)这时出现一个提示框,点击Create Bridging Header,

Swift和Objective-C交互_第3张图片

这样就会生成一个Student.h和Student.m文件,同事还会生成一个中间桥梁文件SwiftCallObjectiveC-Bridging-Header.h,这个文件在swift调用OC中是必须的,他的命名规则是-- “产品名字-Bridging-Header.h”

Swift和Objective-C交互_第4张图片

(4)分别在Student.h和Student.m文件中填写代码

Student.h

[objc] view plain copy

#import   


@interface Student : NSObject  


@property(nonatomic,assign)NSInteger        Id;  

@property(nonatomic,copy)NSString           *name;  


- (id)initWithName:(NSString *)name;  

- (id)initWithId:(NSInteger)Id andName:(NSString *)name;  


- (NSString *)getName;  

+ (NSInteger)maxStudent;  


@end  

Student.m

[objc] view plain copy

#import "Student.h"  


@implementation Student  


- (id)initWithName:(NSString *)name  

{  

self = [super init];  

return self;  

}  


- (id)initWithId:(NSInteger)Id andName:(NSString *)name  

{  

self = [super init];  

if (self) {  

self.name = name;  

self.Id = Id;  

    }  

return self;  

}  


- (NSString *)getName{  

return self.name;  

}  


+ (NSInteger)maxStudent{  

return 100;  

}  


@end  

然后在桥梁文件SwiftCallObjectiveC-Bridging-Header.h中插入代码

#import"Student.h"

(5)在main.m文件中调用Student类

[objc] view plain copy

//创建Student对象,并调用Student的对象方法和类方法  

let s = Student()  

let s1 = Student(id:100,andName:"ming")  

print("name=\(s1?.getName())--student=\(Student.maxStudent())")  

二、Objective-C中调用Swift文件

这里没有swift调用OC那么顺畅,中间遇到一些问题以及注意事项跟大家分享一下!

Demo下载

(1)首先创建一个iOS工程,然后按以下步骤配置一下

Swift和Objective-C交互_第5张图片

(2)创建一个Swift的Test类,选择Swift语言;!!!在这里生成的swift类必须是:类继承于NSObject或者使用@objc进行修饰

这时也会弹出一个桥接文件,这里不像Swift调用OC文件一样是必须的,但是第一次创建时我们必须要点击创建

Swift和Objective-C交互_第6张图片

(3)之后在swift类中添加自己代码

Test.swift

[objc] view plain copy

import UIKit  


class Test: NSObject {  

    var arr = [String]();  

    override init(){  

    }  

    init(cap:NSInteger) {  

arr = Array(repeating:"",count:cap);  

    }  

    subscript(index:Int) -> String?{  

return arr[index];  

    }  

    func getLength() -> Int{  

return arr.count;  

    }  

    func addElem(elm:String){  

arr.append(elm);  

    }  

}  

(4)这时我们可以先编译一下(command+B),这时系统会动生成一个ObjectiveCCallSwift-Swift.h文件,这个文件是所有Swift为了兼容OC产生的.h文件,他的命名规则是:产品名字-Swift.h;这里不会用到我们创建的桥接文件,我们选中 command+ObjectiveCCallSwift-Swift.h 点进去会看到一些自动编译生成的代码,最下方还有转换的OC代码

Swift和Objective-C交互_第7张图片
Swift和Objective-C交互_第8张图片

(5)在ViewController文件中调用swift的类,这时我们要注意如果按照swift类中方法有时报错找不到此方法,这是我们要注意查看Test这个类文件,看看被转换成OC之后方法名是否被修改(大家一定要注意这个步骤顺序的问题,之前博主就是因为顺序问题导致swift类不能识别或者缺少头文件等等问题)

[objc] view plain copy

#import "ViewController.h"  

#import "ObjectiveCCallSwift-Swift.h"  


@interface ViewController ()  


@end  


@implementation ViewController  


- (void)viewDidLoad {  

[super viewDidLoad];  

Test *arr = [[Test alloc]init];  

[arr addElemWithElm:@"hello"];  

[arr addElemWithElm:@"world"];  

NSInteger len = [arr getLength];  

NSString *elm = [arr objectAtIndexedSubscript:0];  

NSLog(@"len--%ld,elm--%@",len,elm);  

}  


@end  


本文出自https://blog.csdn.net/minggeqingchun/article/details/54628876

你可能感兴趣的:(Swift和Objective-C交互)