Swift和Objective-C 混編
參考完整 例子
使用 Swift 進(jìn)行 module 擴(kuò)展
因?yàn)?module 暴露 method 是通過Objective-C
宏來做的,調(diào)用的時候是通過反射,所以Swift擴(kuò)展 module 通過extension
Objective-C
的類。
新建
WXSwiftTestModule.h/m
和WXSwiftTestModule.swift
文件, 在新建Swift文件的時候會提示選擇
Create Bridging Header
, 因?yàn)槲覀円?Swift 中訪問Objective-C
的一些類,正是通過這個 header暴露 OC 的類給 Swift,header 格式為yourTarget-Bridging-Header.h
,我這里創(chuàng)建完header文件名稱為:WeexDemo-Bridging-Header.h
WXSwiftTestModule.h/m
中實(shí)現(xiàn)WXSwiftTestModule.h 中
#import <Foundation/Foundation.h> #import <WeexSDK/WeexSDK.h> @interface WXSwiftTestModule : NSObject <WXModuleProtocol> @end
WXSwiftTestModule.m 中
WeexDemo-Swift.h 這個文件需要編譯一下才可以搜索到,具體的路徑
weex/ios/playground/DerivedData/WeexDemo/Build/Intermediates/WeexDemo.build/Debug-iphonesimulator/WeexDemo.build/DerivedSources/WeexDemo-Swift.h
路徑具體需要根據(jù)自己工程而定
#import "WXSwiftTestModule.h" #import "WeexDemo-Swift.h" // Swift類和方法 被 `Objective-C` 識別需要導(dǎo)入 @implementation WXSwiftTestModule #pragma clang diagnostic push //關(guān)閉unknow selector的warrning #pragma clang diagnostic ignored "-Wundeclared-selector" WX_EXPORT_METHOD(@selector(printSome:callback:)) //Swift 中定義的方法,XCode 轉(zhuǎn)換成的最終的方法名稱,在`WeexDemo-Swift.h`里面查看 #pragma clang diagnostic pop @end
Swift 中實(shí)現(xiàn) 擴(kuò)展 OC 的類
WXSwiftTestModule
,增加了一個方法,這個方法就是我們要暴露出來,在 js 中可以調(diào)到的WXSwiftTestModule.swift
import Foundation public extension WXSwiftTestModule { @objc(printSome:callback:) public func printSome(someThing:String, callback:WXModuleCallback) { print(someThing) callback(someThing) } }
WXSwiftTestModule
和WXModuleCallback
因?yàn)槭?OC 的,需要在WeexDemo-Bridging-Header
中暴露。注意:請在 Swift 文件中為方法添加
@objc
修飾符,避免找不到方法的報錯。WeexDemo-Bridging-Header.h中
// // Use this file to import your target's public headers that you would like to expose to Swift. // #import "WXSwiftTestModule.h" #import "WeexSDK.h"
至此這個使用 Swift 開發(fā)的簡單的 module 已經(jīng)完成
module 使用
注冊 module
[WXSDKEngine registerModule:@"swifter" withClass:[WXSwiftTestModule class]];
前端腳本中用法
<template> <text>Swift Module</text> </template> <script> module.exports = { ready: function() { var swifter = weex.require('swifter'); swifter.printSome("https://www.taobao.com",function(param){ nativeLog(param); }); } }; </script>
更多建議: