Swift 與 Object-C 交互 (Swift版本爲:1.2)

這篇文章主要是介紹 Swift 與 Object-C 之間進行交互的代碼,主要分爲兩個部分。一個是 Swift 項目調用 Object-C 的類,另外一個是 Object-C 項目調用 Swift 類。過程是很簡單,可是對於沒接觸過的人來講,仍是存在一點難度的。git

 

你能夠在 GitHub 上下載此文章相關的源代碼:Swift-Objective-C-Mutual(https://github.com/GarveyCalvin/Swift-Objective-C-Mutual)github

 

1、Swift 調用 Object-Cswift

如今來講說正題吧,目的是「使用 Swift 調用 Object-C」 ,那麼咱們先來準備一下。咱們須要驗證如下問題:this

1.如何調用 Object-C 的類方法;atom

2.如何調用 Object-C 的實例方法;spa

3.如何訪問 Object-C 的屬性3d

 

咱們新建一個 Swift 項目,項目新建完成後,添加 Person 類,添加的語言爲 Object-C 。code

 

點擊 Next 後會有一個彈窗,詢問你是否須要創建一個橋接,就是與 Object-C 鏈接的一個橋樑。它會幫咱們創建一個頭文件,命名方式爲「項目名稱-Bridging-Header.h」,固然這裏咱們選 Yes。對象

 

咱們的結構目錄變成這樣,我這裏新建的橋接文件名爲「SwiftCallObject-C-Bridging-Header.h」。blog

 

這個文件建好之後,是沒有自動幫咱們導入頭文件的,所以咱們須要導入須要被調用的 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() // 調用對象方法

 

 

 

2、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/

本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!

相關文章
相關標籤/搜索