# Swift In Weex
Swift and Objective-C mix-up
a complete demo
# extend module using swift
As we export moudle method using macro and calling in runtime, so we can extend module using swift by extension
bjective-C
class.
You can also finish extending module by write an category for swift class in Objective-C class.
new
WXSwiftTestModule.h/m
andWXSwiftTestModule.swift
file ,you will get a tip as follow during the creation chooseCreate Bridging Header
, as we need to access method inObjective-C
in swift file, and theBridging header
can help us. And the format name of the header file isyourTarget-Bridging-Header.h
, and mine isWeexDemo-Bridging-Header.h
.implementation in
WXSwiftTestModule.h/m
WXSwiftTestModule.h
#import <Foundation/Foundation.h> #import <WeexSDK/WeexSDK.h> @interface WXSwiftTestModule : NSObject <WXModuleProtocol> @end
WXSwiftTestModule.m
you can search WeexDemo-Swift.h after building your project, Xcode will generate this file for us.
for simulator the file path may be:
weex/ios/playground/DerivedData/WeexDemo/Build/Intermediates/WeexDemo.build/Debug-iphonesimulator/WeexDemo.build/DerivedSources/WeexDemo-Swift.h
export method define in swift file.
#import "WXSwiftTestModule.h" #import "WeexDemo-Swift.h" // you need to import the header to make Objective-C code recognize the method defined in swift file. @implementation WXSwiftTestModule #pragma clang diagnostic push //forbid unknow selector warrning #pragma clang diagnostic ignored "-Wundeclared-selector" WX_EXPORT_METHOD(@selector(printSome:callback:)) //method name in Swift, you can get the final method name in `WeexDemo-Swift.h` as the convert of Xcode. #pragma clang diagnostic pop @end
in Swift make an extension for Objective-C class
WXSwiftTestModule
, add a method, and then export it in Objective-C, then we can use it in javaScript.WXSwiftTestModule.swift
import Foundation public extension WXSwiftTestModule { @objc(printSome:callback:) public func printSome(someThing:String, callback:WXModuleCallback) { print(someThing) callback(someThing) } }
we need to expose
WXSwiftTestModule
WXModuleCallback
inWeexDemo-Bridging-Header
as ourObjective-C
need to access them.Attention: Please add the
@objc
attribute to the method in the Swift file to avoid the error for the method cannot be found.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"
by far we have finished our module using swift.
# module usage
register module to WeexSDK
[WXSDKEngine registerModule:@"swifter" withClass:[WXSwiftTestModule class]];
front-end usage
<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>