Swift和Objective-C混合编程

1. 首先打开Xcode6,建立一个项目,这里我使用的Objective-C默认的编程语言,项目名字叫 “SwiftAndObjective”。

2. 为了在OC中使用Swift的演示所以需要建立下面的几个类。

a)建立一个Objective-C的类继承自NSObject,名字叫OCTypeClass, 所以会自动产生两个对应的 .m 和 .h文件,这对熟悉Objective-C的人非常熟悉。

b)  尽力一个Swift类,名字叫SwiftFile1, 在点击创建的时候,会弹出一个提示问是否创建一个hander .h文件,这里必须选择是。因为如果想要在Swift中使用Objective-C的类的话,这是一个必备文件,具体使用稍后再说。结果会创建一个SwiftFile1.swift文件和一个header文件。

c)为了描述访问控制符public、private、默认等的关系,需要再创建一个Swift文件,名字叫SwiftFile2,会生成一个SwiftFile2.swift的文件。

好了文件创建部分完毕。

3. 需要定义类(因为swift可以不继承任何类,但是如果需要被Objective-C使用的时候,我们使用的alloc,new等创建使用的方法是继承自NSObject的,所以Swift中的这些类,我都继承了NSObject了)。

在SwiftFile1.swift文件中创建下面的类

import Foundation

@objc public class PublicObjcTypeSwiftClass1: NSObject {
    var property1: Int = 0
}

@objc class ObjcTypeSwiftClass1: NSObject {
    var property1: Int = 0
}

@objc private class ObjcPrivateTypeSwiftClass1: NSObject {
    var property1: Int = 0
}

public class PublicSwiftClass1 : NSObject {
    var property1: Int = 0
}

class SwiftClass1: NSObject {
    var property1: Int = 0
}

private class PrivateSwiftClass1: NSObject {
    var property1: Int = 0
}

在SwiftFile2.swift中创建下面的类

<pre name="code" class="objc">import Foundation

@objc public class PublicObjcTypeSwiftClass2: NSObject {
    var property1: Int = 0
    //var ocClass: OCTypeClass = OCTypeClass()

    //func test() {
    //    ocClass.property1 = 0
    //}
}

@objc class ObjcTypeSwiftClass2: NSObject {
    var property1: Int = 0
}

@objc private class ObjcPrivateTypeSwiftClass2: NSObject {
    var property1: Int = 0
}

public class PublicSwiftClass2: NSObject {
    var property1: Int = 0
}

class SwiftClass2: NSObject {
    var property1: Int = 0
}

private class PrivateSwiftClass2: NSObject {
    var property1: Int = 0
}

4. 因为OC文件定义之后会自动生成对应的类,所以无需再次定义了。

#import "OCTypeClass.h"
#import "SwiftAndObjective-Swift.h"

@implementation OCTypeClass

- (void)test
{
    PublicObjcTypeSwiftClass1 *type = [[PublicObjcTypeSwiftClass1 alloc] init];
    type.property1 = 0;

    ObjcTypeSwiftClass1 *type2 = [[ObjcTypeSwiftClass1 alloc] init];
    type2.property1 = 0;
}

@end

5. 打开OCTypeClass.m 文件我们需要引用Swift文件中的类。可以使用“项目工程名+ ‘-’ + Swfit.h"的形式引入所以的public的并且被标记为@objc的类(标记成@objc的类,即使不显示的写出public标记也会被Objective-C类使用)。下面的具体的代码(注意当写#import “”的使用,目前版本的Xcode不会自动识别需要的Swift的header名字,需要自己手动写,注意:不要写错项目名,如果确认是写对了,但是又一直报错可以去刷新项目,或者重启,重新build:
Project-》 Clean, Project-》Build,大不了重新启动Xcode)。

6.  完成后可以通过查看源代码的形式(command + 鼠标左键)的形式查看xcode自动生成的Objective-C类。

// Generated by Swift version 1.1 (swift-600.0.54.20)
#pragma clang diagnostic push

#if defined(__has_include) && __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
#endif

#pragma clang diagnostic ignored "-Wauto-import"
#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif !defined(__cplusplus) || __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif

typedef struct _NSZone NSZone;

#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#if defined(__has_feature) && __has_feature(modules)
@import ObjectiveC;
#endif

#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"

SWIFT_CLASS("_TtC17SwiftAndObjective19ObjcTypeSwiftClass1")
@interface ObjcTypeSwiftClass1 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

SWIFT_CLASS("_TtC17SwiftAndObjective19ObjcTypeSwiftClass2")
@interface ObjcTypeSwiftClass2 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

SWIFT_CLASS("_TtC17SwiftAndObjective25PublicObjcTypeSwiftClass1")
@interface PublicObjcTypeSwiftClass1 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

SWIFT_CLASS("_TtC17SwiftAndObjective25PublicObjcTypeSwiftClass2")
@interface PublicObjcTypeSwiftClass2 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

SWIFT_CLASS("_TtC17SwiftAndObjective17PublicSwiftClass1")
@interface PublicSwiftClass1 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

SWIFT_CLASS("_TtC17SwiftAndObjective17PublicSwiftClass2")
@interface PublicSwiftClass2 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

SWIFT_CLASS("_TtC17SwiftAndObjective11SwiftClass1")
@interface SwiftClass1 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

SWIFT_CLASS("_TtC17SwiftAndObjective11SwiftClass2")
@interface SwiftClass2 : NSObject
@property (nonatomic) NSInteger property1;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

#pragma clang diagnostic pop

7. 下面开始在Swift文件中使用Objective-C的类。

a)打开xcode自动为我们生成的SwiftAndObjective-Bridging-Header.h文件, 导入暴露给swift的类。

这里为了方便就使用刚刚定义的类,只是为了演示:

#import "OCTypeClass.h"

b)然后我们什么都不需要做了,直接在Swfit文件中实现吧。

import Foundation

@objc public class PublicObjcTypeSwiftClass2: NSObject {
    var property1: Int = 0
    var ocClass: OCTypeClass = OCTypeClass()

    func test() {
        ocClass.property1 = 0
    }
}

@objc class ObjcTypeSwiftClass2: NSObject {
    var property1: Int = 0
}

@objc private class ObjcPrivateTypeSwiftClass2: NSObject {
    var property1: Int = 0
}

public class PublicSwiftClass2: NSObject {
    var property1: Int = 0
}

class SwiftClass2: NSObject {
    var property1: Int = 0
}

private class PrivateSwiftClass2: NSObject {
    var property1: Int = 0
}

注意:

1. 如果想把一个Swfit类暴露给Objective-C的话需要标识@objc

2. 对于private类型的Swift类,只能在所定义的Swift文件中被使用。

3. 在一个Swift文件中的类,只能访问外部Swift文件中定义的public类型的类。

差点忽略了最重要的一点:如果有什么问题或者错误,欢迎指正或者交流。

示例代码: 代码下载地址

http://download.csdn.net/detail/liyan223/8070805

时间: 2024-11-05 07:30:27

Swift和Objective-C混合编程的相关文章

在OC项目中添加Swift文件并实现混合编程

对于已经工作的开发者,并不适合也没有条件从一个全新的swift项目开始,进行开发. 虽然网上关于swift和oc混合编程的教程比较多,但是大多是基于 swift项目的,所以对咱们 OCer的参考价值有一定折扣. 现在swift虽然仍然存在很多缺陷,但是鉴于苹果的强势,是时候在项目中把简单的功能交给swift了,给自己,给项目,给swift一个缓冲区,都是极好的. 说了这么多,开始上代码. 现在的背景是: 已经有一个oc项目了,我想要加入 swfit,并且实现 oc调用 swift ,swift调

Qt for iOS,Qt 与Objective C混合编程

项目设置 既然要聊 Qt 混合 OC 编程,首先要简单介绍一下 Objective C .我只有一句话:Go,问搜索引擎去.因为我所知实在有限,怕误导了您.当然如果您不怕,往下看吧. OC源文件介绍 首先我要说一下 Objective C 的源文件,后缀是.m 或 .mm ,在 .mm 文件里,可以直接使用 C++ 代码.所以,我们要混合 Qt 代码与 OC 代码,就需要在 Qt 项目里加入 mm 文件. pro 文件配置 Qt SDK for Mac ,安装之后, Qt Creator 会使用

在一个项目中同时使用Swift和Objective-C代码混合编程的方法

主要介绍了在一个项目中同时使用Swift和Objective-C代码的方法,在一个工程中同时使用Swift和Objective-C混合语言编程的方法. Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实现应用的一部分功能,并无缝地并入已有的 Objective-C 的代码中. Mix and Match 概述 Objective-C 和 Swift

Swift 4 和 Objective-C 混合编程(一) 快速起步

Swift 4 和 Objective-C 在同一个工程里的混搭编程的方法 你可以在 xcode 里同时使用 Swift 和 Objective-C(以下简称OC)来写代码,混搭编程的好处很多,比如允许大量代码的复用,在性能和开发效率之间找到平衡等. 在 Swift 中引用 OC 我们建立一个工程时,XCode会询问我们选择什么语言进行开发,如果你选择的是OC,那么当你第一次新建一个swift文件时,开发环境会询问你是否建立一个 .h 文件.这个 .h 文件命名方式是 "#ProjectName

《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射

原创文章,欢迎转载.转载请注明:关东升的博客 如果引入必要的头文件,在Objective-C语言中可以使用C数据类型.而在Swift语言中是不能直接使用C数据类型,苹果公司为Swift语言提供与C语言相对应数据类型.这些类型主要包括:C语言基本数据类型和指针类型. C语言基本数据类型 如表所述是Swift数据类型与C语言基本数据类型对应关系表. Swift语言中的这些数据类型与Swift原生的数据类型一样都,本质上都是结构体类型.我们可以他们的构造函数创建这些数据类型的实例.示例代码如下: va

swift与oc的混合编程

参考链接:http://blog.csdn.net/huangchentao/article/details/35278663 1.建立了一个OC的项目(MixtureOCandSwift) 2.创建了一个oc的类(OcTest) 3.创建了一个swift的类(SwiftTest)当创建这个类的时候Xcode会提示是否创建MixtureOCandSwift-Bridging-Header.h文件,选择create 4.如果要在OcTest中使用SwiftTest: ? ? ?4.1->在Mixt

Swift和Objective-C混合编程——OC调用Swift

既然讲的是Swift和OC的混合编程,我的上一篇博客<Swift和Objective-C混合编程--Swift调用OC>讲的是如何在一个Swift项目中调用OC代码,现在我们要实现在OC项目中调用Swift代码,也是非常的方便.具体实现步骤如下: (1)创建一个iOS项目,语言选择OC,设备选择iPhone. (2)然后在项目中右键,New Files,选择Cocoa Touch Class,然后语言选择Swift.继承自NSObject.新建,会有一个对话框,选择Yes即可. . (3)此时

IOS-Swift、Objective-C、C++混合编程

1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的,所以如果需要在Objective-C调用C++语言就需要直接将后缀m文件改为mm,然后就可以调用C++代码了. Objective-C兼容C,Objective-C++兼容C.C++. 接下来是在OC工程中创建C++文件,并调用C++的代码: 然后在OC文件中直接用C++的语法调用C++,所以前提是

swift、object-c、C++、C混合编程

1 Object-C调用C++ 在Object-C程序有两种文件.m和.mm文件. .m文件是Object-C文件,是完全兼容C语言,所以可以在.m文件中直接使用C语言的语法. .mm文件是Object-C++文件,是完全兼容C++和C语言,所以可以在.mm文件中直接使用C++和C语言的语法. 所以当需要在Object-C中调用C++时,可以将.m文件直接重命名为.mm文件,这样就可以使用C++的语法和内容了. 如在main.mm文件: 1 #import <Foundation/Foundat

Swift和Objective-C混合编程——Swift调用OC

在iOS应用的开发中,Swift必将取代OC,两者的趋势是"短期共存,长期取代".但以前有太多的代码是用OC语言完成的,而Swift的开发也从 OC中继承了很多的特性,两者也是有很多的类似之处.目前Swift和OC可以实现无缝的混合编程. 我这里会实现一个简单的Swift调用OC的iOS实例,实现过程是十分的简单的.就像我们所有的Hello World一样.具体操作步骤如下: (1)Xcode中新建一个iOS项目,语言选择Swift,设备选择iPhone.目录结构如下: (2)然后在该