美文网首页
第三十六章 Swift 与OC交互

第三十六章 Swift 与OC交互

作者: 我有小尾巴快看 | 来源:发表于2019-06-12 11:56 被阅读0次

如果不可避免需要混编,那么我们需要了解一些知识来降低不同语言之间的差异。

1. OC 导入 Swift

OC项目如果想要将某个类导入Swift,那么仅需要创建桥接文件(一般创建第一个Swift文件时会提示,点击同意后会自动创建以及进行配置),将对应的头文件添加进去即可。

// Project-Bridging-Swift.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "Model.h"

此时Swift便可调用该类(一般需要先编译一下才能被编译器语法糖发现)。

注意:Swfit仅支持OC类,不支持C++类,如有需要,你需要先封装成OC类。


由于OC没有命名空间,一般都会携带前缀,但Swift并不需要,所以我们可以NS_SWIFT_NAME重命名。

@interface PKModel : NSObject

@end

// let model = PKModel()

如果我们不希望有PK前缀,可以利用宏NS_SWIFT_NAME来重命名

NS_SWIFT_NAME(Model)
@interface PKModel : NSObject

@end

// let model = Model()

那么Swift重该类便是Model,而非PKModel

该宏同样可以给函数命名。

let model = Model()

- (void)testWithContent:(nullable id)content value:(double)value status:(int)status;
model.test(withContent: Any?, value: Double, status: Int32)

- (void)testWithContent:(nullable id)content value:(double)value status:(int)status NS_SWIFT_NAME(test(content:value:status:));
model.test(content: Any?, value: Double, status: Int32)

2. Swift 导入 OC

Swift 导入 OC相对就要复杂一些,需要满足以下条件。

  • 必须继承与NSObject并添加@objc,无论想要暴露的是类还是属性还是函数。
  • 暴露出的类型必须是OC所支持的,即基本类型和NSObject子类,struct等无法暴露。
  • 权限必须是internal及以上。
  • 需要使用Swift类需要导入ProjectName-Swift.h文件(ProjectName是你的项目名)。

注意:元组可以暴露给OC,但无法使用,能打印出来。


我们可以利用@objc来重命名导入OC的类

@objc(PKPerson class Person: NSObject {
    @objc(logWithMessage:) func log(message: String?) {
        print(message ?? "")
    }
}

PKPerson *person = [[PKPerson alloc] init];
[person logWithMessage:@"food"]; // "food"

如果有一些不想暴露给OC的内容,可以添加@nonobjc

@objc(PKPerson) class Person: NSObject {
    @nonobjc func log(message: String?) {
        print(message ?? "")
    }
}

[PKPerson.new log:@"food"]; // No visible @interface for 'PKPerson' declares the selector 'logWithMessage:'

相关文章

  • 第三十六章 Swift 与OC交互

    如果不可避免需要混编,那么我们需要了解一些知识来降低不同语言之间的差异。 1. OC 导入 Swift OC项目如...

  • Swift WKWebView与JS交互

    本篇是基于Swift4.0为大家介绍下WKWebView与JS的交互. OC版本请跳转OC WKWebView与J...

  • Swift与OC交互

    为了方面查阅特转一篇文章 Swift的设计的初衷就是摆脱ObjC沉重的历史包袱,毕竟ObjC的历史太过悠久,相比于...

  • Swift与OC交互

    源码请点击github地址下载。 主要内容: 1.在OC项目里:1.1.OC代码调用Swift方法1.2.Swif...

  • swift 与 OC交互

    1、swift使用OC里定义的NS_Options组合 参考:iOS中的OC中的枚举(NS_ENUM和NS_OPT...

  • OC与JS交互

    OC与JS交互前言 OC与JS交互之UIWebView OC与JS交互之WebViewJavascriptBrid...

  • swift基础小结1

    swift基础小结 for 循环OC与Swift对比 While循环与downhill循环 OC与swift使用的...

  • Using Swift with Cocoa and Objec

    原文地址:Working with Cocoa Frameworks 作为与OC交互的一部分,Swift提供了简单...

  • OC与swift的区别

    OC与Swift的区别一(文件结构) OC与Swift的区别一(常量、变量、运算符) OC与Swift的区别三(条...

  • OC/SWIFT 与JS 交互

    开发中移动端经常涉及到与js交互的功能,例如:js需要调用oc的方法,或者oc需要调用js的方法。 一、js调用o...

网友评论

      本文标题:第三十六章 Swift 与OC交互

      本文链接:https://www.haomeiwen.com/subject/cimkfctx.html