oc swift 中引用 在

2016-08-22 17:20:57 zhanglizhi111 阅读数 2502

转自:http://m.blog.csdn.net/article/details?id=47100535



一.在OC中使用Swift

1.首先创建一个工程名字就叫做CHWTest1

2.在工程的Build Setting中把Defines Module改为YES,如图


3.把Product Name设为工程的名字,如图


4.在你的OC文件中导入ProjectName-Swift.h(这个 ProjectName-Swift.h是系统自动创建的,不要手动去创建,ProjectName是你的工程得名字,这里就是CHWTest1


这时候编译会报错,因为并没有Swift文件

5.创建Swift文件


这里创建一个Swift的类,语言选择为Swift,然后会提示你,是不是创建一个OC的桥接头文件,这里选择YES,创建完之后,你的工程里是这样的

是的,你会发现你的工程中多了个 PrductName-Bridging-Header.h的一个文件,这个的作用就是OC和Swift的桥接,里面有这样一句话

 Use this file to import your target's public headers that you would like to expose to Swift.意思就是,在这里面你个以导入类,以供你的Swift使用,这里面我的例子是OC-Swift-OC三个类之间的push,具体代码如下




然后push的效果就出来了,如图


OK,到这里,OC中使用Swift就已经结束,不难吧!

二,如何在Swift中使用OC

Swift中使用OC文件和上面差不多,只是需要几步

1.创建一个Swift工程,这里面就叫做CHWTest2

2.Swift代码引用OC,需依靠 Objective-C bridging header 将相关文件暴露给Swift,创建 Objective-C bridging header 有两种方法:

(1)当你在Swift项目中尝试创建OC文件时,系统会自动帮你创建 Objective-C bridging header,如下




此时除了 .h 、.m 文件之外,会额外多出一个叫做 项目工程名-Bridging-Header.h 的文件,这个文件中导入的类是可以暴露给Swift看到的。你要做的,只是#import XXXX.


这个步骤和上面是差不多的,另外一种方式就是

(2)自己创建 Objective-C-bridging-header这个桥接文件

File > New > File > (iOS or OS X) > Source > Header File切记,名字 一定要 是 项目工程名-Bridging-Header.然后还有一步,在项目的 Build Settings选项里,要确保Swift Compiler 选项里有这个 Bridging Header 文件的设置,路径必须指向文件本身,而不是目录!


这里,Swift中就可以使用OC文件了!


2018-05-09 14:00:01 yingBi2014 阅读数 1420

Swift中引用OC看这篇
在OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。

特别注意
1、被使用的Swift的类必须是至少继承自NSObject的,不然OC识别不了这个类。
2、Swift中的属性和方法,要加上@objc标识,不然识别不了。

代码如下,Swift中定义了一个类,这个类有一个类属性和一个类方法。

class UUUU:NSObject {
    @objc static var yyy:String?
    @objc static func test()->(){
        print("XXXX")
    }
}

在OC需要用到的地方先引入#import “XXX-Swift.h”,然后就能用了

    UUUU *u  =[UUUU new];
    NSLog(@"%@" , UUUU.yyy);
    [UUUU test];

Swift中使用类属性和类方法代替宏定义

另外,在Swift的类中,可以使用只读的类属性和类方法来代替OC中的宏定义,这样定义的宏在OC中直接用,省略了在oc中再定义一次的麻烦。代码如下

class UUUU:NSObject {
    //只读的类属性
    @objc static var name:String{
        return "jim"
    }
    //类方法
    @objc static func RGBColor(r:Float , g:Float , b:Float) -> UIColor {
        return UIColor.init(red: (CGFloat(r/255.0)), green: (CGFloat(r/255.0)), blue: (CGFloat(r/255.0)), alpha: 1.0)
    }
}

另一种Swift代替宏定义的方法是使用全局变量和全局函数来定义,Swift中使用全局变量和函数代替宏

2015-12-20 15:33:22 wj610671226 阅读数 958

总结一下自己对OC中和Swift中循环引用的认识。

一.OC中的循环引用分为类中的循环引用和对象之间的循环引用。

1.类的循环引用

造成原因: 在两个类的.h文件中使用了#import "<#header#>" 而造成两个类之间的循环引用

解决办法:在一个类的.h中使用#import "<#header#>",而在另外一个类中使用@class <#name#>;

2.对象之间的循环引用:即两个类的实例进行了相互指向,

如:

// 教室
ClassRoom * room = [[ClassRoom alloc] init];
// 学生
Student * stu = [[Student alloc] init];

// 设置引用关系
room.student = stu;
stu.classRoom = room;

一个教室里面有学生,一个学生存在于一个教室里面。

解决办法:1.一个类里面的属性使用强引用,另一个类中的属性使用弱引用

// 学生 若引用
@property (nonatomic, assign) Student * student;
// 教室 强引用</span>
@property (nonatomic, strong) ClassRoom * classRoom;

 如果两个属性都是使用的强引用Strong,则想要释放的时候,直接让某个属性等于nil,强制打破循环引用

stu.classRoom = nil;或者 room.student = nil;

3.Block中循环引用问题

在OC环境下Block引起的循环引用问题Xcode会给出一个警告提示

解决办法:


两种方法:建议使用第一种方法,后面一种是比较老得方法了,在使用过程中如果对象为空了,会引发程序崩溃。

二、Swift中的循环引用其实差不多,只是处理的语法不一样而已,关键是理解什么样的代码会造成循环引用。

1.对象之间的循环引用,直接上图

    

解决办法一

解决办法二

运行效果:

2.闭包引起的循环引用

引起循环引用的代码:

解决办法:

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-04-12 20:11:58 studying_ios 阅读数 5955

最近在研究swift,就我看来,swift确实是比OC更优秀的语言,这可以体现在很多方面,网上已经对比的很透彻,就不一一赘述。
今天研究了一下如何在OC项目中使用swift文件,即OC和swift的混编问题,发现在OC中要使用swift文件也是蛮简单的,实践过程列如下:
1)首先随便创建了一个OC项目,就叫 DetialViewDemo
这里写图片描述
2)因为Swift的代码默认是使用module管理的,所以两者混编的最重要的一步,就是把我们的Swift代码作为一个module暴露给OC工程,具体步骤如下:
这里写图片描述
3)创建一个swift文件或者将已有的swift文件拖入项目中,我这里是拖入了一个练习swift写的一个类:
这里写图片描述
注意点:swift文件添加的时候会提示是否添加桥接文件,直接点击不创建就OK
4)好了,文件都准备好了,接下来就需要在使用到swift文件的类中引入”Product Module Name-Swift.h”,其中Product Module Name其实就是项目的名称,这个在上面配置Module的图中也能看到,然后我们就可以愉快地和swift进行玩耍了
这里写图片描述
注意:引入Product Module Name-Swift.h的时候不一定自动提示,手写之后编译就可以了

当然,我很好奇这是怎么回事,然后我就command+点击 Person 进入了内部查看,发现原来苹果将所有的swift文件中的代码转成了oc的代码,不管你引入多少个swift文件,都会一股脑在Product Module Name-Swift.h文件中翻译成oc文件以便我们oc程序调用
这里写图片描述

怎么样,很强大吧,朋友们赶紧转过来吧,开始自己的swift开发,这绝对是苹果的未来啊!