2015-11-13 10:06:44 lvdezhou 阅读数 1579
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2911 人正在学习 去看看 任苹蜻

1、oc工程调用swift-----自动创建桥接头文件

创建一个oc工程:


设置Product Module Name = 工程名



创建一个swift文件:

点击自动创建桥接头文件:



设置Objective-C Bridging Header 如下图:



至此,我们可以在oc中调用swift了

测试代码:


import Foundation

class Student: NSObject {
    var name : String = "dzl"
    var age : Int = 22
}

在oc中引入头文件  "工程名-swift.h" 就可以使用swift中的类了

注:这个头文件是不可见的

#import "ViewController.h"

#import "OCuseSwift1-swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Student * s1 = [[Student alloc] init];
    NSLog(@"%@", s1.name);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

输出:

2015-11-13 10:01:32.250 OCuseSwift1[1040:20007] dzl

此时swift也是可以引用OC的,只需将swift需要使用的oc类头文件在桥接头文件中引入即可,






2、oc工程调用swift-----手动创建桥接头文件


首先创建一个oc工程,与上面相同

然后创建一个swift文件,但是不选择创建桥接头文件,如图:



然后手动创建桥接头文件,就相当于创建一个普通的头文件一样,只是命名一定要严格按照规则:



工程设置中指定桥接头文件:


经测试,oc引用swift或者swift引用oc都是可以的,测试方法与上面相同,这里不再赘述。



3、swift工程调用-----自动创建桥接头文件 和 手动创建桥接头文件,基本与上面操作一直,不再详述




其实桥接头文件里面引入oc头文件,是为了swift可以访问oc文件,

在oc中引入   工程名-swift.h   文件  是为了oc可以访问swift,但这个文件是不可见的,不过可以通过command+鼠标左键查看该文件



2019-02-26 14:16:29 wei78008023 阅读数 1525
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2911 人正在学习 去看看 任苹蜻

之前在开发是遇到了在OC文件中调用Swift对象的变量调用不到的问题,这里总结一下:

1.首先我们一个Swift项目TestProject。

2.建立一个Swift的文件继承自NSObject名字为SwiftFile.swift,并声明一个字符串变量swiftName。

import UIKit

class SwiftFile: NSObject {

    var swiftName = ""
}

3.建立一个OC的文件ObjectFile,并导入“HFSTeacher-Swift.h”(OC想要调用Swift需要导入此文件)如何配置以及导入原因可以自行查询。

#import "ObjectFile.h"
#import "HFSTeacher-Swift.h"

@implementation ObjectFile

-(void)oneMethod
{
    SwiftFile *swiftFile = [[SwiftFile alloc]init];
    NSLog(@"%@",swiftFile.swiftName);
}

@end

这个时候会报错,说在SwiftFile中找不到swiftName成员。

4.这个时候需要在SwiftFile.swift中加入一个声明@objcMembers以表示文件中成员可以被OC调用:

import UIKit

@objcMembers
class SwiftFile: NSObject {

    var swiftName = ""
}

5.如此则大功告成!

2018-03-29 15:55:35 Ziank 阅读数 334
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2911 人正在学习 去看看 任苹蜻

在使用OC和swift进行混编时,我们经常会需要在swift中使用OC中的宏定义,但是这些宏定义经常会提示无法找到或者类型错误,那么我们到底应该怎么做才正确呢?

OC中的宏定义和C一样,主要有以下几种情况:


OC宏定义
  1. 定义一个常量值,后面可以方便使用;如 #define TOOLBAR_HEIGHT 44
  2. 定义一个不会变化的常用变量值,或者一个较长的对象属性;如#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
  3. 定义一个会变化的常用变量值,或者一个较长的对象属性;如:#define STATUS_BAR_HEIGHT ([UIApplication sharedApplication].statusBarFrame.size.height)
  4. 定义一个带参数的宏,类似于一个函数;如#define RGB_COLOR(r,g,b) [UIColor colorWithRed:r/255.f green:g/255.f blue:b/255.f alpha:1.0]

对于这四种情况,在swift中只能处理第一种情况,而且是直接转换为了let TOOLBAR_HEIGHT = 44;那么由于使用TOOLBAR_HEIGTH的地方基本上都是使用CGFloat,而TOOLBAR_HEIGTH的类型却是Int,就会导致类型不匹配。

所以我们在混编时对于这些宏定义都需要单独处理:

swift宏定义处理
  • 第一种的话就比较简单,可以直接使用let TOOLBAR_HEIGTH:CGFloat = 44来替换就可以了;
  • 第二种因为后面的值永远不会改变,也可以使用let来替换;可以用let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
  • 第三种情况,也就是后面的值会发生改变,如状态栏高度,就不能够使用let来替换了,因为let是定义的常量,如果使用let,如果将会导致不能够获取正确的值;这里可以使用函数来获取:func STATUSBAR_HEIGHT() -> CGFloat { return UIApplication.sharedApplication().statusBarFrame.size.height };使用时通过函数STATUSBAR_HEIGTH()获取状态栏高度;
  • 第四种,因为有输入参数,所以也只能使用函数来替换;如:func RGB_COLOR(r:CGFloat, g:CGFloat, b:CGFloat) -> UIColor {return UIColor(red: r, green: g, blue: b, alpha: 1.0)};
2017-05-23 12:15:55 SharkToping 阅读数 529
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2911 人正在学习 去看看 任苹蜻

一、在OC文件中调用Swift代码需要导入一个#import <工程名-Swift.h>的头文件、该文件编译一下就会由系统创建,并且是不可见的。

二、有‘工程名-Bridging-Header’这样的头文件

     该文件是自动创建的在swift中调用OC代码使用的桥接文件,需要将在Swift中使用的OC的相关头文件添加在此处,

如没有该文件则需要如下操作:

1、手动创建一个头文件(名称不限)。

2、在Build Settings中搜索Objective-C Bridging Header。

3、将该文件相对于工程的路径填入该项。


2018-07-20 16:19:07 kaiyuanheshang 阅读数 2833
  • iOS/Swift/OC/Objective-C/Xcode/0基础/入门

    这是一门快速入门iOS开发的课程,目的是让大家快速学会,iOS开发环境搭建,和iOS一些基础知识,最后完成一个小项目。 项目信息 提供完整的Git提交历史,和每节视频一一对应,目前有41次提交,355行注释,271行代码(不包含可视化布局文件,纯Swift和Objective-C代码)。

    2911 人正在学习 去看看 任苹蜻

Swift 调用 OC

Swift 调用 OC 分为两种常见情况,一种是直接在 Application 的 project 中使用;另一种情况是,在 framework 开发中使用。

对于互相调用的原理,如下图所示,更详细的内容可以参考 《Using Swif with Cocoa and Objective-C》

这里写图片描述

图 一

其中最关键的就是三个文件 bridging header(app)、umbrella header(framework)、generated header(swift to OC)。所以主要工作就在于如何生成和指定这些文件。

Application

在一个 Swift 开发的工程中可以通过两种方法来生成桥接文件。

第一种是,直接拖拽 OC 文件到工程中,此时系统会询问是否生成桥接文件,如图:

这里写图片描述

选择 “Create Bridging Header” Xcode 就会自动生成桥接需要的文件和修改相关配置。

另外一种方式是自己指定。桥接文件的命名方式为:ProjectName-Bridging-Header.h,所以先按照这个格式生成一个头文件,然后在 “Build Settings” -> “Swift Compiler - General” -> “Objective-C Bridging Header” 处指定桥接头。

设置完成后,只要在桥接头中引用相应的 OC 文件就可以在工程中的 Swift 文件中使用对应的 OC 类和方法。

framework

framework 中不允许使用桥接头的方式(即不允许指定 “Objective-C Bridging Header” 的值)。在新建一个 framework 的 Project 时,会自动生成一个同名的头文件。比如新建一个工程为 DuAR 的fraework,会自动生成 DuAR.h 文件,这个文件就是 “umbrella header”,如果在这个工程中用到了 OC 源文件或者 OC 写的三方库,就可以在这里引入对应的头文件,从而实现工程中的 Swift 可以使用 OC 类和方法。

关于 “umbrella header” 还有一个叫 “umbrella framework” 的东西,可以实现 A framework 包含 B framework,但是这种方式不推荐使用。具体请搜索。

OC call Swift

在我们新建完一个 Swift 工程的时候,“Swift Compiler - General” 里会有一个叫做 “Objective-C Generated Interface Header Name” 的选项,这个选项里的值为 “ProjectName-Swift.h”,这个文件就是系统生成的 Swift 文件对应的 Objective-C 的头文件。

当在 OC 文件中调用 Swift 文件中的类的时候,首先在 OC 文件中引用上面提到的头文件,即 #import "ProjectName-Swift.h"。这个文件虽然在工程中看不到,但是她真实存在,编译后,你可以按住Command+单击该文件名,就会看到具体生成的代码。
引入后,具体类的使用,直接按照OC的方式使用即可。

这个方法适用于 Application 工程和 framework 工程。

注意事项

相比于 OC 的灵活和强大的运行时,Swift 强调更高的安全性。所以 Swift 的运行时很弱,强类型等特点使得未声明为支持 OC 的 Swift 类和方法是不能通过桥接的方式在 OC 文件中使用的。

如果需要一个 Swift 的类或方法在 OC中可以使用,则必须通过标记的形式告知编译器,即图一中的 @class,同时还有 @objc 等。或者这个类可以直接继承自 NSObject 或其子类,这样也能实现 Swift 类或方法在 OC 中被调用。

Swift 中有许多 OC 没有的特性。比如,Swift 有元组、特有的枚举等。这些特性也不能够在 OC 中使用。所以,要使用的混编文件要注意 Swift 独有属性问题。

swift 调用oc委托

阅读数 764

swift调用第三方oc库

阅读数 1060

oc调用swift

阅读数 1594

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