SwiftyBeaver 是一個在 swift 項目裡面非常好用的 logger,雖然已經有一個 SBObjectiveCWrapper 可以用來在 objective-c 的文件下調用的 SwiftyBeaver,但 SwiftyBeaver 本身仍然需要使用 swift 去初始化,這個工具的初衷是給那些混雜了 objective-c 的 swift 項目裡面可以用 objective-c 的風格去調用,而不是真正地支持 objective-c 的項目。下面就一步一步來創建一個 objective-c 的項目,通過混雜 swift 的模式,我們自己寫一個調用了 SwiftyBeaver 的 log 工具來在 objective-c 上面享受 SwiftyBeaver 帶來的便利。
*下面的方法理論上適用於任何使用 swift 寫的插件添加到 objective-c 的項目中
環境:Xcode 8.3.3,swift 3.1,CocoaPod 1.3.1
- 新增項目 SwiftyBeaverObj
添加 Podfile
target ‘SwiftyBeaverObj’ do
use_frameworks!
pod ‘SwiftyBeaver’
end
因為 SwiftyBeaver 是 swift 的庫,所以必須聲明 use_frameworks!。另外,根據 Xcode 的 swift 版本,這裏的 SwiftyBeaver 應該選擇對應的版本,具體參考 SwiftyBeaver 的文檔。- pod install,使用 Xcode 打開 SwiftyBeaverObj.xcworkspace。因為當前 Xcode 的 swift 版本比 SwiftyBeaver 的版本高,因此會在第一次打開 Xcode 時提示更新代碼轉換 swift 版本,這裏點擊 Later
然後在 Pods 的 Build Settings 裡面指定編譯使用的 swift 版本。由於 cocoapod 會重設過 Pods 的設定,所以每次運行完 pod install 都要重複這一步驟。
- 添加 swift 文件 SBLog.swift,Xcode 會彈出以下提示,是因為 Xcode 偵測到你嘗試使用 swift 和 objective-c 混合編程,會自動生成一個橋接頭文件( bridging header),並且配置好運行 swift 必須的環境,點擊創建即可。
*橋接頭文件僅用於在 swift 文件裡引入 objective-c 的類的時候用到,這個例子不會用到 進入 SBLog.swift,創建一個繼承 NSObject 的類並聲明一個 SwiftyBeaver 的單例,在類裡面實現各種打印日誌的功能,下面實現了 verbose 作為實例
// SBLog.swift
import Foundation
import SwiftyBeaverclass SBLog: NSObject {
private static let sharedInstance = SBLog()
private let log = SwiftyBeaver.self
private override init() {super.init() log.addDestination(ConsoleDestination())
}
class func share() -> SBLog {return sharedInstance
}
func verbose(_ message: String) {log.verbose(message)
}
}
這裏通過聲明類函數 share 來作為 SBLog 的唯一入口,保證 SwiftyBeaver 只會初始化一次,所有的 SwiftyBeaver 配置均可在 init() 函數裏自定義。引入類。回到 objective-c,在所有需要使用 SBLog 的 .m 文件或者 .pch 文件中引入以下頭文件:
#import “SwiftyBeaverObj-Swift.h”
該文件是一開始設置混合編程的時候 Xcode 生成的,文件會自動把項目中所有 swift 類生成對應的 objective-c 的類的聲明。該文件由 Xcode 動態生成,不會出現在文件系統中,也不能直接編輯,文件命名規則是 [target name]-Swift.h,可在項目的 Build Setting->Swift Compiler - General->Objective-C Generated Interface Header Name 找到。- 調用函數
[[SBLog share] verbose:@”This is a verbose message.”];
console 打印對應信息
enjoy it!