• Swift 与 Object-C 交互 (Swift版本为:1.2)


    这篇文章主要是介绍 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/

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

  • 相关阅读:
    网页的摘要信息
    自我介绍
    DIV和SPAN的区别
    软件工程简介
    设置层的漂移
    构建之法现代软件工程
    手机验证码的相关知识
    Python2和Python3的区别
    我的第一个练习
    结对编程后传之做汉堡
  • 原文地址:https://www.cnblogs.com/GarveyCalvin/p/4504609.html
Copyright © 2020-2023  润新知