望其项背 iOS - swift: swift 和 oc 互相调用

项目地址 https://github.com/webabcd/IosDemo
作者 webabcd

望其项背 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"

项目地址 https://github.com/webabcd/IosDemo
作者 webabcd

posted @ 2022-01-27 11:46  webabcd  阅读(247)  评论(0编辑  收藏  举报