望其项背 iOS - swift: swift 和 oc 互相调用
望其项背 iOS - swift: swift 和 oc 互相调用
示例如下:
SwiftView16.swift
/*
* 本例用于演示 swift 和 oc 互相调用
*
* 参见 SwiftView16_swift.swift, SwiftView16_oc.h, SwiftView16_oc.m 文件
*/
import Foundation
import SwiftUI
struct SwiftView16: View {
var result: String = "";
init() {
result = sample1()
}
var body: some View {
VStack {
HStack {
Text(result)
Spacer()
}
Spacer()
}
}
func sample1() -> String {
// 用于演示 oc 调用 swift
let a = SwiftView16_oc().ocToSwift()!;
// 用于演示 swift 调用 oc
let b = SwiftView16_swift().swiftToOc();
return "\(a)\n\(b)";
}
}
SwiftView16_swift.swift
/*
* 本例用于演示 swift 如何调用 oc,以及被 oc 调用
*
*
* 如果需要 swift 调用 oc
* 1、需要创建一个名为 项目名称-Bridging-Header.h 的文件(桥接文件),并在 Build Settings 的 Objective-C Bridging Header 中配置好此文件的路径(注:在 oc 项目中新建一个 swift 文件时,xcode 会提示是否需要自动创建桥接文件)
* a) 本例中会有一个 IosDemo-Bridging-Header.h 文件,Objective-C Bridging Header 配置的值是 IosDemo/Swift/IosDemo-Bridging-Header.h
* b) 如果是在 swift 项目中创建 oc 文件,则会有弹窗提示是否需要创建此文件,如果确认的话则 xcode 会自动完成上述工作
* 2、在 项目名称-Bridging-Header.h 的文件中通过 import 导入你需要调用的 .h 文件
* a) 本例中的 IosDemo-Bridging-Header.h 文件的内容为 # import "SwiftView16_oc.h"
* 3、然后你就可以按 swift 的方式调用 oc 了
*
*
* 如果需要 swift 被 oc 调用
* 1、swift 的类要继承 NSObject
* 2、允许被 oc 调用的 swift 的方法要用 @objc 标记
*/
import Foundation
class SwiftView16_swift : NSObject
{
// swift 被 oc 调用的示例
@objc func hello(message: String) -> String
{
return "hello: \(message)";
}
// swift 调用 oc 的示例
func swiftToOc() -> String
{
let x = SwiftView16_oc();
return x.hello("swift 调用 oc");
}
}
SwiftView16_oc.h
#import <Foundation/Foundation.h>
@interface SwiftView16_oc : NSObject
- (NSString *)hello:(NSString *)message;
- (NSString *)ocToSwift;
@end
SwiftView16_oc.m
/*
* 本例用于演示 oc 如何调用 swift,以及被 swift 调用
*
*
* 如果需要 oc 调用 swift
* 1、需要桥接文件(此文件是不可见,但是可引用的)
* a) 对于 swift 项目来说,此文件在你新建项目的时候就自动生成了
* b) 如果是在 oc 项目中创建 swift 文件,则会有弹窗提示是否需要创建此文件,如果确认的话则 xcode 会自动完成上述工作
* 2、引用桥接文件
* a) 桥接文件的文件名为 项目名称-Swift.h
* b) 本例中此桥接文件的文件名为 IosDemo-Swift.h,通过 #import "IosDemo-Swift.h" 引用即可
* 3、然后你就可以按 oc 的方式调用 swift 了
*/
#import "SwiftView16_oc.h"
#import "IosDemo-Swift.h"
@implementation SwiftView16_oc
// oc 被 swift 调用的示例
- (NSString *)hello:(NSString *)message
{
return [@"hello: " stringByAppendingString:message];
}
// oc 调用 swift 的示例
- (NSString *)ocToSwift
{
SwiftView16_swift *x = [[SwiftView16_swift alloc] init];
return [x helloWithMessage:@"oc 调用 swift"];
}
@end
IosDemo-Bridging-Header.h
# import "SwiftView16_oc.h"