<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在建立另一種語言的檔案時XCode會提示建立專案名-Bridging-Header.h的橋接檔案
1.建立OC檔案
#import "MyViewController.h" @interface MyViewController () @end @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; self.title = @"OC"; self.view.backgroundColor = UIColor.cyanColor; UILabel *lbl = [UILabel new]; lbl.text = @"OC的標籤"; lbl.backgroundColor = UIColor.redColor; lbl.frame = CGRectMake(100, 100, 150, 50); [self.view addSubview:lbl]; }
2.橋接檔案:專案名-Bridging-Header.h 檔案中要將想要使用的 OC的.h檔案匯入
#import "MyViewController.h"
3.在Swift檔案中呼叫
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. title = "Swift" view.backgroundColor = .white let btn = UIButton(type: .custom) btn.frame = CGRect(x: 150, y: 150, width: 150, height: 100) btn.setTitle("點選跳轉", for: .normal) btn.backgroundColor = .green view.addSubview(btn) btn.addTarget(self, action: #selector(didClickBtn), for: UIControl.Event.touchUpInside) } @objc func didClickBtn() { let myVC = MyViewController() navigationController?.pushViewController(myVC, animated: true) } }
Button執行的方法要用 @objc 修飾
// OC的MyViewController.h檔案 #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface MyViewController : UIViewController // 將method1方法在Swift中替換成swiftMethod()方法 - (void)method1 NS_SWIFT_NAME(swiftMethd()); // 將method2方法再Swift中隱藏 - (void)method2 NS_SWIFT_UNAVAILABLE("Swift中該方法不可呼叫"); @end NS_ASSUME_NONNULL_END
class ViewController: UIViewController { override func viewDidLoad() { ...... } @objc func didClickBtn() { let myVC = MyViewController() // 在Swift中找不到OC的method1與method2方法,只有一個改了名的swiftMethod方法 myVC.swiftMethod() navigationController?.pushViewController(myVC, animated: true) } }
在Swift中呼叫OC的介面有時發現並不符合Swift的語法規範或者使用起來會比較彆扭,這個時候可以使用NS_REFINED_FOR_SWIFT宏定義 來對OC的介面進行升級改造
NS_REFINED_FOR_SWIFT 可用於方法和屬性,新增了 NS_REFINED_FOR_SWIFT 的 Objective-C API 在匯入到 Swift 時,具體的 API 重新命名規則如下:
對於 初始化方法,在其第一個引數標籤前面加 "__"
// Objective-C API - (instancetype)initWithClassName:(NSString *)name NS_REFINED_FOR_SWIFT; // In Swift init(__className: String)
對於 其它方法,在其基名前面加 "__"
// Objective-C API - (NSString *)displayNameForMode:(DisplayMode)mode NS_REFINED_FOR_SWIFT; // In Swift func __displayNameForMode(mode: DisplayMode) -> String
下標方法將被視為任何其它方法,在方法名前面加 "__"(而不是作為 Swift 下標匯入)
其他宣告將在其名稱前加上 "__",例如屬性
// Objective-C API @property DisplayMode mode NS_REFINED_FOR_SWIFT; // In Swift var __mode: DisplayMode { get set }
注意:NS_REFINED_FOR_SWIFT 和 NS_SWIFT_NAME 一起用的話,NS_REFINED_FOR_SWIFT 不生效,而是以 NS_SWIFT_NAME 指定的名稱重新命名 Objective-C API
建立Swift檔案
import Foundation // 必須繼承於 NSObject class Person: NSObject { // 想公開給OC的要使用 @objc 修飾 @objc var name: String @objc var age : Int @objc init(name: String, age: Int) { self.name = name self.age = age } }
在Swift檔案中引入專案名-Swift.h檔案,然後使用Swift內容
#import "MyViewController.h" #import "SwiftAndOC-Swift.h" @interface MyViewController () @end @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; Person *p = [[Person alloc] initWithName:@"LZ" age:18]; NSLog(@"%@",p.name); }
常數宏用let引數代替
無參變數宏可以用"唯讀屬性"代替也可用函數代替
變數宏用函數代替
以上就是IOS開發Swift 與 OC相互呼叫詳解的詳細內容,更多關於Swift OC相互呼叫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45