1. 程式人生 > >Swift 與 Object-C 互動 (Swift版本為:1.2)

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

本文版權歸作者和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作!

相關推薦

Swift Object-C 互動 Swift版本1.2

這篇文章主要是介紹 Swift 與 Object-C 之間進行互動的程式碼,主要分為兩個部分。一個是 Swift 專案呼叫 Object-C 的類,另一個是 Object-C 專案呼叫 Swift 類。過程是很簡單,但是對於沒接觸過的人來說,還是存在一點難度的。 你可以在 GitHub 上下載此文章相關

unity 中 c# object-c 互動

C/C++可以直接與object-c互動,只需把檔案字尾寫成.mm就行了。c#又可以和C/C++互動,所以嘛。。。c#也就可以和object-c互動了。 1、在unity中 c#呼叫object-c 函式 首先,定義一個新建一個.mm檔案,然後在裡面定義一個C風格介面的函

第 16 章 C 預處理器和 C可變參數stdarg.h

args rar 分享 預處理 close aps code 可變 use 1 /*------------------------------------------------- 2 varargs.c -- use variable number of

由前序遍歷和中序遍歷重建二叉樹前序序列1 2 3 4 5 6

由前序遍歷和中序遍歷重建二叉樹 前序序列(根-左-右):1 2 3 4 5 6 中序序列(左-根-右):3 2 4 1 6 5 1、由前序遍歷可知根節點為第一個元素1,在中序遍歷序列中找到1對

蘋果iOS裝置Identifier名稱對應大全swift原始碼2018~2019

因為開發需要,重新整理了下這塊的程式碼。因為比較通用。所以發出來給需要的人,複製可用。 其中包含了iphone ,ipad,apple watch ,itouch,模擬器等的識別。如果有不全的話請留言。更新日期為2018年11月初。預估2019蘋果新品釋出之前均可使用。  

SwiftObject-C的區別和優缺點

一、Swift和Objective-C的聯絡 Swift和Objective-C共用一套執行時環境,Swift的型別可以橋接到Objective-C(下面我簡稱OC),反之亦然。兩者可以互相引用混合程式設計。其次就是,OC之前積累的很多類庫,在Swift中大部分依然可以直接

lua c/c++ 互動6 lua呼叫C++使用陣列 和字串函式

lua呼叫 c++ 的 兩個函式: 一個是 對lua 陣列 呼叫函式替換 陣列元素,一個 分割字串 test.lua --陣列操作 a = {1,2,3,4,5,6} swapArray(a,function(t) return t + 1 end) local

swiftOC混編建立混編工程

原創文章轉載請註明出處。 背景 Swift語言自推出以來蘋果官方就開始努力開始推這門新語言。就在15年WWDC上更是把Swift進行了開源,瞬間star就開始不斷飆升,截止今天(16年1月25)已經達到26059個star【原始碼請點選這裡】

(排序演算法)linux c語言實現二分插入排序演算法簡化版本的插入排序演算法

 二分插入演算法是在已經排序好的序列裡插入一個元素,是穩定的演算法,關鍵詞是折中。 比如說我要在12345678910裡插入一個3,那麼我先看看中間的數比3大,還是比3小,要是比3大,我就去後一半,如果是比3小,我就去前一半,現在進入某個一半後,再做如此操作,最後將其他的元素依次往後挪

關於git的使用 — 建立倉庫,本地倉庫遠端倉庫的基本互動上傳,下載,更新

建立本地倉庫 通過git init命令把這個目錄變成Git可以管理的倉庫 *本地倉庫與遠端倉庫連線 1.生成金鑰對 大多數 Git 伺服器都會選擇使用 SSH 公鑰來進行授權。系統中的每個使用者都必須提供一個公鑰用於授權,沒有的話就要生成一個。生成公鑰的過

Nodejs學習筆記十四— Mongoose介紹和入門 && Nodejs學習筆記--- MongoDB的互動mongodb/node-mongodb-native、MongoDB入門

目錄 簡介   MongoDB    開源,高效能的NoSQL資料庫;支援索引、叢集、複製和故障轉移、各種語言的驅動程式;高伸縮性;   node-mongodb-native   mongodb的nodejs驅動; MongoDB安裝(windows)   按照官方說明在win7 64位

android中Webviewjavascript的互動互相呼叫

最近做android專案中遇到要在webview中做與js互動相關的東東,涉及到js中呼叫android本地的方法,於是查了資料整理了一下android和js互相呼叫的過程。如下demo,demo的主要實現過程如下:通過載入本地的html檔案(裡面有js指令碼),實現and

Nodejs學習筆記--- Redis的互動mranney/node_redis入門

目錄 簡介和安裝 redis簡介: 開源高效能key-value儲存;採用記憶體中(in-memory)資料集的方式,也可以採用磁碟儲存方式(前者效能高,但資料可能丟失,後者正好相反) 支援字串(strings)、雜湊(hashes)、列表(lists)、集合(sets)和 有序集

Nodejs學習筆記--- MongoDB的互動mongodb/node-mongodb-native、MongoDB入門

目錄 簡介   MongoDB    開源,高效能的NoSQL資料庫;支援索引、叢集、複製和故障轉移、各種語言的驅動程式;高伸縮性;   node-mongodb-native   mongodb的nodejs驅動; MongoDB安裝(windows)   按照官方

mysqlpython的互動封裝,模擬使用者註冊,登入的案例

好,今晚我申正道打了雞血,瘋狂總結,主要不想一個數據庫拖太久時間了,今天好像都第三天了,後面的東西還很多,這樣只會把知識越壓越多,所以讓我們幹起來了吧,這篇主要就說一下mysql資料庫與python的互動,程式碼的封裝和使用。 直接把我寫的原始碼放上來吧,

js android 的互動方法互呼叫 和android向 js傳遞值, js向android傳引數 事件攔截看上一篇

mail_detail_v2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewpor

Http伺服器的互動主要post和get

GET方式提交的資料最多隻能是2048位元組,因為GET是通過URL提交資料,那麼GET可提交的資料量就跟URL的長度有    直接關係了。而實際上,URL不存在引數上限的問題,HTTP協議規範沒有對URL長度進行限制,這就是為啥我說沒有    限制的原因了。這個限制是特定的瀏覽器及伺服器對它的限制。IE對U

AndroidWebViewJavascript互動相互呼叫引數、傳值

Android中可以使用WebView載入網頁,同時Android端的java程式碼可以與網頁上的javascript程式碼之間相互呼叫。 效果圖: (一)Android部分: 佈局程式碼: <LinearLayout xmlns:android="http://s

C#引數值傳遞引用傳遞問題我們需要時刻溫習基礎知識

C#引數值傳遞與引用傳遞問題,太久沒有關注這些基礎的C#知識,導致很多東西都忘了,幸好有公司小培訓幫助補充了這些。 本次例子以傳遞類物件引數,對類物件的屬性值進行寫操作。(接著昨天寫序列化的程式碼來寫的)     class Program     {         p

PhotonServer伺服器利用NHibernate操作資料庫客戶端互動登入、註冊、多人位置同步

1. 伺服器端1.1 伺服器端工程準備        此次專案內容是對上兩次的整和,所以前兩篇博文是單個功能的基礎,分別是①NHibernate和MySQL互動,②PhotonServer的使用。這次專案也是在這兩個基礎之上進行的,很多直接拷貝過來進行修改;資料庫還是用myg