这篇文章主要是介绍 Swift 与 Object-C 之间进行交互的代码,主要分为两个部分。一个是 Swift 项目调用 Object-C 的类,另一个是 Object-C 项目调用 Swift 类。过程是很简单,但是对于没接触过的人来说,还是存在一点难度的。

你可以在 GitHub 上下载此文章相关的源代码:Swift-Objective-C-Mutual(https://github.com/GarveyCalvin/Swift-Objective-C-Mutual)

一、Swift 调用 Object-C

现在来说说正题吧,目的是“使用 Swift 调用 Object-C” ,那么我们先来准备一下。我们需要验证以下问题:

1.如何调用 Object-C 的类方法;

2.如何调用 Object-C 的实例方法;

3.如何访问 Object-C 的属性

我们新建一个 Swift 项目,项目新建完成后,添加 Person 类,添加的语言为 Object-C 。

点击 Next 后会有一个弹窗,询问你是否需要建立一个桥接,就是与 Object-C 连接的一个桥梁。它会帮我们建立一个头文件,命名方式为“项目名称-Bridging-Header.h”,当然这里我们选 Yes。

我们的结构目录变成这样,我这里新建的桥接文件名为“SwiftCallObject-C-Bridging-Header.h”。

这个文件建好以后,是没有自动帮我们导入头文件的,因此我们需要导入需要被调用的 Object-C 类头文件,这样我们的 Swift 才能正确地调用 Object-C。

//
// Use this file to import your target's public headers that you would like to expose to Swift.
// #import "Person.h"

我们来看看 Person 类的代码,这个类宝义了一个 name 的属性,和一个 print 实例方法,还有一个 personWithName: 方法,主要是示范给你们如何调用这些。先来看 Person.h 。

//
// Person.h
// SwiftCallObject-C
//
// Created by baijiawei on 15/5/14.
// Copyright (c) 2015年 GarveyCalvin. All rights reserved.
// #import <Foundation/Foundation.h> @interface Person : NSObject @property (strong, nonatomic) NSString *name; - (void)print; + (id)personWithName:(NSString *)name; @end

Person.m 。

//
// Person.m
// SwiftCallObject-C
//
// Created by baijiawei on 15/5/14.
// Copyright (c) 2015年 GarveyCalvin. All rights reserved.
// #import "Person.h" @implementation Person - (void)print
{
NSLog(@"name is %@", self.name);
} + (id)personWithName:(NSString *)name
{
Person *person = [[Person alloc] init];
person.name = name;
return person;
} @end

调用方法如下。

var person = Person() // 实例化对象
person.name = "Garvey" // 访问对象属性
person.print() // 调用对象方法 var personC = Person.personWithName("Calvin") as! Person // 调用 Person 的类方法,返回一个它的实例
personC.print() // 调用对象方法

二、Object-C 调用 Swift

同样的,我们需要创建一个 Object-C 的项目,然后创建 Swift 的类。我们先来创建 Person 类。

如果你是第在 Object-C 项目里第一次创建 Swift 的类,那么依旧会有窗口提示,询问你是否需要创建桥接文件。然而这里有一个问题,如果你选择 NO ,意思就是不创建桥接文件,那么它将不会默认帮你生成对应的调用代码; 如果你选择 Yes, 那么它将默认帮你生成对应的调用代码。那么具体是什么意思呢?。

现在先来看一下 Person 类的代码,很简单,只有一个方法和一个属性。

//
// Person.swift
// Object_CCallSwift
//
// Created by baijiawei on 15/5/17.
// Copyright (c) 2015年 GarveyCalvin. All rights reserved.
// import Cocoa @objc class Person: NSObject {
var name: String? func print() {
println("person name is \(name)")
}
}

注意:Object-C 代用的 Swift 代码,Swift 类在 class 前需要添加关键字@“@objc”,否则,Xcode将不会为你维护头文件。

这里先说明一下,在 Object-C 中调用 Swift 时,Xcode 会帮助我们自动生成头文件,不需要我们去维护。然而这里有一个前提,你必须创建好桥接文件,否则...。

当我们需要使用时,引入的文件名为“工程名称-Swift.h”。

#import "Object_CCallSwift-Swift.h"

引入后我们就可以点击头文件,刚刚提及过头文件几次了,现在我们来看看头文件的代码,只截取关键部分。

我们可以看到有 Person 类的相关代码,风格是 Object-C ,应该是 Xcode 为我们转码了。谨记,在 Object-C 调用 Swift 端代码时,Swift 类的 class 前需要加“@objc”关键字。

常见问题

引入头文件时出错

网上的 Object-C 项目调用 Object-C 代码会遇到的问题,现在网上热门的文章,绝大部分都是存在错误的,只要你不够细心,你就很有可能被“入网”。

例如是这篇文章:http://www.ituring.com.cn/tupubarticle/2687。该文章错误点,#import "工程名-swift.h":

错在 HelloWorld-swift.h ,其中 swift 的 开头字母 S 必须是大写的!我就是因为这个原因,找了好久都没发现到,也是因为太过于相信网上的文章缘故吧(这里我不是在怪作者)。或许是 Xcode 更新后或是 Swift 语言更新后所作的改动吧,所以才会导致这个原因。

有一个办法可以确认你的桥接文件全称,在项目的设置里可以看到:

可以很清晰地看见,正确的写法是“工程名-Swift.h”,只要把这个填对了,后面的调用就简单多了。


博文作者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

Swift 与 Object-C 交互 (Swift版本为:1.2)的更多相关文章

  1. OpenStack Object Storage(Swift)概述

    概述 OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性.冗余和持久性. Swift并不是文件系统或者实时 ...

  2. Swift与JS的交互

    Swift与JS的交互 原理 同Object-C与JS交互的大同小异,只是方法形式改变了. 首先我们需要引入iOS7.0出来的JavaScriptCore.framework JavaScriptCo ...

  3. iOS: 学习笔记, Swift与C指针交互(译)

    Swift与C指针交互 Objective-C和C API经常需要使用指针. 在设计上, Swift数据类型可以自然的与基于指针的Cocoa API一起工作, Swift自动处理几种常用的指针参数. ...

  4. Swift迁入第三方库时的版本错误解决

    我的swift的项目用的是swift 2.3的版本,但是用CocoaPods迁入一个第三方:ObjectMapper后,编译会出现这样一个问题: Use Legacy Swift Language V ...

  5. iOS - Swift 与 C 语言交互编程

    前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...

  6. Swift 正式开源, 包括 Swift 核心库和包管理器

    Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章.自从苹果发布 Swfit 编程语言,就成为了历史上发展最快的编程语言之一.Swift 通过设计使得软件编写更加快速更加安全 ...

  7. 一步一步学习Swift之(一):关于swift与开发环境配置

    一.什么是Swift? 1.Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用. 2.Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制. 3.Sw ...

  8. swift:Optional Type 、Swift和Objective-C混编的讲解

    ❤️❤️❤️swift中的Optional Type的?和!含义:其实就是一个装包和拆包的过程 optional的含义: Optional事实上是一个枚举类型,Optional包含None和Some两 ...

  9. swift-01-简述swift与OC区别

    swift语言 Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1].在设计Swift时.就有意和Objective-C共存,Objective-C是A ...

  10. swift学习:第一个swift程序

    原文:swift学习:第一个swift程序 最近swift有点火,赶紧跟上学习.于是,个人第一个swift程序诞生了... 新建项目

随机推荐

  1. HDU 4612 Warm up tarjan 树的直径

    Warm up 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 Description N planets are connected by ...

  2. URAL 1995 Illegal spices 贪心构造

    Illegal spices 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=1995 Description Jabba: Han, m ...

  3. PHP session过期机制和配置

    问题:使用PHP session时会遇到明明超过了session过期时间,但session依然完好无损的活着,让人头大. 其实仔细看一下php.ini关于PHP session回收机制就一目了然了. ...

  4. Homebrew-macOS缺失的软件包管理器(简称brew)

    [简介] brew又叫Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,只需要一个简单的命令,非常方便 [遇到的问题] 在真正了解软件包管理工具之前,一直是 ...

  5. jquery css 主菜单样式的跳转

    想要实现的效果事实上是挺常见的那种:网页的主菜单一開始有一种默认的样式(如A样式),当鼠标经过某一菜单项时.此菜单项会套用一种样式(如B样式),当鼠标点击某一菜单项时.当前菜单项会套用B样式,其余菜单 ...

  6. 菜鸟的mongoDB学习---(七)MongoDB 备份(mongodump)与恢复(mongorerstore)

    MongoDB数据备份 在Mongodb中我们使用mongodump命令来备份MongoDB数据. 该命令能够导出全部数据到指定文件夹中. mongodump命令能够通过參数指定导出的数据量级转存的s ...

  7. Mac配置PHP开发环境

    安装环境如下: Mac OS 10.10.1 Apache 2.4.9 PHP 5.5.14 MySQL 5.6.22 Apache配置 在Mac OS 10.10.1中是自带Apache软件的,我们 ...

  8. Mac OSX 系统目录结构(转)

    摘要 在OS X的系统中,不再有Windows用户熟悉的C盘.D盘,这是因为OS X底层是Unix系统,其目录机构符合Unix系统的规范.MAC机器主板使用了Intel主导的EFI标准,硬盘分区格式采 ...

  9. 定制NSLog便于打印调试

    定制NSLog便于打印调试 本人之前从事过嵌入式开发,对于打印调试比较在行,现分享定制的NSLog以及教大家如何使用. 源码下载地址  https://github.com/YouXianMing/Y ...

  10. SWT常用组件

    SWT类所代表的事件常量: 事件类型常量 说明 SWT.Activate 当激活窗口时 SWT.Arm 菜单项被选中之前 SWT.Close 关闭窗口时 SWT.Collapse 折叠树的节点时 SW ...