2016-07-15 12:06:46 Belle_luckly 阅读数 253
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40463 人正在学习 去看看 欧阳坚
1.在OC调用Swift语言的代码
在使用OC编写的工程中创建Swift语言的代码,创建的时候会给出一个是否创建OC语言的桥梁,选择创建 ,目的是引入OC 语言的头文件的,是让Swift语言执行OC 语言程序的。并不是让OC运行Swift语言程序的。如果想要让OC运行Swift语言程序的话,他会创建出一个不可见的文件(桥梁),我们需要引入这个不可见的文件。
我们需要在OC程序中引入那个不可见文件(秘密桥梁)就是你当前的 “工程名-Swift.h”,然后在你需要使用的地方调用即可。(可能还是报错的但是运行后就好了)

2.使用Swift调用OC语言的代码
与上边相反的你使用的是Swift语言编写的工程,需要用到OC编写的代码时,创建工程的时候也是会提示上述所说的OC语言桥梁Header,我们把需要使用的OC语言代码的头文件添加到生成的桥梁文件yourProjectName-Bridging-Header.h 中就可以了。
2017-04-12 14:35:21 cordova 阅读数 1361
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40463 人正在学习 去看看 欧阳坚

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语言之间的互调。

2016-11-06 12:09:35 baidu_31683691 阅读数 2284
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40463 人正在学习 去看看 欧阳坚

说起这个话题,在我看来,比项目中的OC混编C++,C等简单些,毕竟OC和Swift都是苹果自己的开发语言,API什么的都一样,还是更容易混合开发些,好了,废话不多说,切正题,OC与Swift怎么混和开发呢?OC类中可以引入Swift语言写的类,同样,Swift类中也可以引入OC语言写的类,这点首先我们得毋庸置疑!

1.OC中引入Swift:

1.创建一个OC的工程


2.创建一个swift类


3.点击next之后会出现下边这个


4.点击创建这个桥,Xcode就会自动生成一个隐藏的文件,名字为“ProductName-Swift.h”;还有一个文件是一个桥接头文件,名字为“ProductName-Bridging-header.h”


5.我们可以点开上边的“ProductName-Swift.h”,看看里边会有什么?


6.我们会发觉里边全是用OC写的,已经把Swift语言成功得转化为了OC,好强大!!!所以就能用了啊,我们试着调用下看看:


7.成功调起了Swift语言写的一个controller。

2.Swift中引入OC:

在Swift中引入OC,前边的创建类的过程我就不多赘述了,只看不一样的,刚我们在上边不是说有一个“ProductName-Bridging-Header.h”是不是还没用到,对的,现在就要用了,我们知道的,Swift是没有.h头文件的,但是OC是有头文件的,所以就有一个桥,看下图:


对的,就是把Swift需要用的OC的类的头文件写到这个“ProductName-Bridging-Header.h”即可,就可调起来,我们试试看:


come on,成功调起!!!

就是这样了,自己跟着写一下就OK了


Hope To Help You!

2019-02-27 20:49:18 Flying_in_the_world 阅读数 628
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40463 人正在学习 去看看 欧阳坚

OC和Swift是苹果爸爸的原生语言,Swift代替OC的成本太高,需要过度和时间,但是现在的Swift的成长很快,在这个矛盾的时间,我们必须混编了。

1、创建一个新的工程 ,工程的名字叫OCAndSwiftDemo。

 

2、配置工程

3创建swift 类

1在工程左侧列表右击,选中new file 

一直next到创建成功,最后一个按钮是create

这个按钮一定要点,这是oc和swift的桥接文件,

点击完上面的按钮就会有这个文件这是我写的

3TestDemo类的代码

4、viewController类的代码

总结:

swift调用oc: 需要在统一的bridge头文件(xxx-Bridging-Header.h)里面import,然后即可使用。

oc调用swift: 需要在暴露出来的方法和属性上加@objc否则不可用;且文件的类需要继承自NSObject或NSObject的子类。

 

参考:

https://www.jianshu.com/p/2ed48b954612

官方文档链接: 
https://developer.apple.com/documentation/swift 

 

奉上demo:https://download.csdn.net/download/flying_in_the_world/10979726

2016-07-22 18:33:53 hbblzjy 阅读数 1664
  • iOS开发教程之OC语言

    Objective-C是扩充C的面向对象编程语言,iOS开发是用的Objective-C语言,本专题更系统的讲解Objective-C语言当中的一些要点,类的封装、基本数据结构(NSString、NSData)、继承、内存管理(retain点语法、MyArray、AutoreleasePool、浅拷贝详述、深拷贝详述)等内容。

    40463 人正在学习 去看看 欧阳坚

OC与Swift两种实现方式基本上区别不大,主要是在一些对象或方法的调用方式不同,附带源码。

OC代码样式:

self.view.backgroundColor = [UIColor blackColor];
    
    //加载颗粒状的火花图片
    CAEmitterLayer *emitterLa = [CAEmitterLayer layer];
    emitterLa.emitterPosition = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height*(.75));//*(0.75)
    emitterLa.renderMode = kCAEmitterLayerAdditive;
    
    //在爆炸前逐渐隐藏发射颗粒
    CAEmitterCell *emitterCeRocket = [CAEmitterCell emitterCell];
    emitterCeRocket.emissionLongitude = -M_PI/2;
    emitterCeRocket.emissionLatitude = 0;
    emitterCeRocket.lifetime = 1.6;
    emitterCeRocket.birthRate = 1;
    emitterCeRocket.velocity = 400;
    emitterCeRocket.velocityRange = 100;
    emitterCeRocket.yAcceleration = 250;
    emitterCeRocket.emissionRange = M_PI/4;
    emitterCeRocket.color = CGColorCreateCopy([UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.5].CGColor);
    emitterCeRocket.redRange = 0.5;
    emitterCeRocket.greenRange = 0.5;
    emitterCeRocket.blueRange = 0.5;
    //设置动画效果的路径名称
    [emitterCeRocket setName:@"rocket"];
    
    //添加路径状态
    CAEmitterCell *emitterCeFly = [CAEmitterCell emitterCell];
    emitterCeFly.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
    emitterCeFly.emissionLongitude = (4*M_PI)/2;
    emitterCeFly.scale = 0.4;
    emitterCeFly.velocity = 100;
    emitterCeFly.birthRate = 45;
    emitterCeFly.lifetime = 1.5;
    emitterCeFly.yAcceleration = 350;
    emitterCeFly.emissionRange = M_PI/7;
    emitterCeFly.alphaSpeed = -0.7;
    emitterCeFly.scaleSpeed = -0.1;
    emitterCeFly.scaleRange = 0.1;
    emitterCeFly.beginTime = 0.01;
    emitterCeFly.duration = 0.7;
    
    //设置爆炸
    CAEmitterCell *emitterCeFirework = [CAEmitterCell emitterCell];
    emitterCeFirework.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
    emitterCeFirework.birthRate = 9999;
    emitterCeFirework.scale = 0.6;
    emitterCeFirework.velocity = 130;
    emitterCeFirework.lifetime = 2;
    emitterCeFirework.alphaSpeed = -0.2;
    emitterCeFirework.yAcceleration = 80;
    emitterCeFirework.beginTime = 1.5;
    emitterCeFirework.duration = 0.1;
    emitterCeFirework.emissionRange = 2*M_PI;
    emitterCeFirework.scaleSpeed = -0.1;
    emitterCeFirework.spin = 2;
    //设置爆炸动画名称
    [emitterCeFirework setName:@"firework"];
    
    //添加重复过程
    CAEmitterCell *emitterCePreSpark = [CAEmitterCell emitterCell];
    emitterCePreSpark.birthRate = 80;
    emitterCePreSpark.velocity = emitterCeFirework.velocity*0.7;
    emitterCePreSpark.lifetime = 1.7;
    emitterCePreSpark.yAcceleration = emitterCeFirework.yAcceleration*0.85;
    emitterCePreSpark.beginTime = emitterCeFirework.beginTime-0.2;
    emitterCePreSpark.emissionRange = emitterCeFirework.emissionRange;
    emitterCePreSpark.greenSpeed = 100;
    emitterCePreSpark.blueSpeed = 100;
    emitterCePreSpark.redSpeed = 100;
    //设置重复动画名称
    [emitterCePreSpark setName:@"preSpark"];
    
    //烟花最后的闪光
    CAEmitterCell *emitterCeSparkle = [CAEmitterCell emitterCell];
    emitterCeSparkle.contents = (id)[UIImage imageNamed:@"tspark.png"].CGImage;
    emitterCeSparkle.lifetime = 0.05;
    emitterCeSparkle.yAcceleration = 250;
    emitterCeSparkle.beginTime = 0.8;
    emitterCeSparkle.scale = 0.4;
    emitterCeSparkle.birthRate = 10;
    
    emitterCePreSpark.emitterCells = [NSArray arrayWithObjects:emitterCeSparkle, nil];
    emitterCeRocket.emitterCells = [NSArray arrayWithObjects:emitterCeFly,emitterCeFirework,emitterCePreSpark, nil];
    emitterLa.emitterCells = [NSArray arrayWithObjects:emitterCeRocket, nil];
    
    [self.view.layer addSublayer:emitterLa];

Swift的代码样式:

self.view.backgroundColor = UIColor.blackColor();
        
        //加载颗粒状的火花图片
        let emitterLa = CAEmitterLayer();
        emitterLa.emitterPosition = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height*0.75);
        emitterLa.renderMode = kCAEmitterLayerAdditive;
        
        //爆炸前逐渐隐藏发射颗粒
        let emitterCeRocket = CAEmitterCell();
        emitterCeRocket.emissionLongitude = CGFloat(-M_PI_2);
        emitterCeRocket.emissionLatitude = 0;
        emitterCeRocket.lifetime = 1.6;
        emitterCeRocket.birthRate = 1;
        emitterCeRocket.velocity = 400;
        emitterCeRocket.velocityRange = 100;
        emitterCeRocket.yAcceleration = 250;
        emitterCeRocket.emissionRange = CGFloat(M_PI/4);
        emitterCeRocket.color = CGColorCreateCopy(UIColor(red: 0.5, green:0.5, blue:0.5, alpha:0.5).CGColor);
        emitterCeRocket.redRange = 0.5;
        emitterCeRocket.greenRange = 0.5;
        emitterCeRocket.blueRange = 0.5;
        //设置动画效果的路径名称
        emitterCeRocket.name = "rocket";
        
        //添加路径状态
        let emitterCeFly = CAEmitterCell();
        emitterCeFly.contents = UIImage(named: "tspark.png")!.CGImage;
        emitterCeFly.emissionLongitude = CGFloat((4*M_PI)/2);
        emitterCeFly.scale = 0.4;
        emitterCeFly.velocity = 100;
        emitterCeFly.birthRate = 45;
        emitterCeFly.lifetime = 1.5;
        emitterCeFly.yAcceleration = 350;
        emitterCeFly.emissionRange = CGFloat(M_PI/7);
        emitterCeFly.alphaSpeed = -0.7;
        emitterCeFly.scaleSpeed = -0.1;
        emitterCeFly.scaleRange = 0.1;
        emitterCeFly.beginTime = 0.01;
        emitterCeFly.duration = 0.7;
        
        //设置爆炸
        let emitterCeFirework = CAEmitterCell();
        emitterCeFirework.contents = UIImage(named: "tspark.png")!.CGImage;
        emitterCeFirework.birthRate = 9999;
        emitterCeFirework.scale = 0.6;
        emitterCeFirework.velocity = 130;
        emitterCeFirework.lifetime = 2;
        emitterCeFirework.alphaSpeed = -0.2;
        emitterCeFirework.yAcceleration = 80;
        emitterCeFirework.beginTime = 1.5;
        emitterCeFirework.duration = 0.1;
        emitterCeFirework.emissionRange = CGFloat(2*M_PI);
        emitterCeFirework.scaleSpeed = -0.1;
        emitterCeFirework.spin = 2;
        //设置爆炸动画名称
        emitterCeFirework.name = "firework";
        
        //添加重复过程
        let emitterCePreSpark = CAEmitterCell();
        emitterCePreSpark.birthRate = 80;
        emitterCePreSpark.velocity = emitterCeFirework.velocity*0.7;
        emitterCePreSpark.lifetime = 1.7;
        emitterCePreSpark.yAcceleration = emitterCeFirework.yAcceleration*0.85;
        emitterCePreSpark.beginTime = emitterCeFirework.beginTime-0.2;
        emitterCePreSpark.emissionRange = emitterCeFirework.emissionRange;
        emitterCePreSpark.greenSpeed = 100;
        emitterCePreSpark.blueSpeed = 100;
        emitterCePreSpark.redSpeed = 100;
        //设置重复动画名称
        emitterCePreSpark.name = "preSpark";
        
        //烟花最后的闪光
        let emitterCeSparkle = CAEmitterCell();
        emitterCeSparkle.contents = UIImage(named: "tspark.png")!.CGImage;
        emitterCeSparkle.lifetime = 0.05;
        emitterCeSparkle.yAcceleration = 250;
        emitterCeSparkle.beginTime = 0.8;
        emitterCeSparkle.scale = 0.4;
        emitterCeSparkle.birthRate = 10;
        
        emitterCePreSpark.emitterCells = NSArray.init(objects:emitterCeSparkle) as? [CAEmitterCell];
        emitterCeRocket.emitterCells = NSArray.init(objects:emitterCeFly,emitterCeFirework,emitterCePreSpark) as? [CAEmitterCell];
        emitterLa.emitterCells = NSArray.init(objects: emitterCeRocket) as? [CAEmitterCell];
        
        self.view.layer.addSublayer(emitterLa);

源码下载:http://download.csdn.net/detail/hbblzjy/9584992

效果图:

                 

OC与swift区别

阅读数 485

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