十分鐘從oc轉向swift(混編)
swift出來已經有好幾年了,很多ios開發者估計都想過從oc轉向swift。瞭解過swift的同學可能都知道,相比oc,它有更簡潔的語法;定義變數更簡單;函數語言程式設計的支援等等~
有些公司專案一直使用的成熟的oc,也有公司也許會採用swift來開發。各有千秋。所以,oc與swift混編的開發模式也就出來了~
下面就介紹一下如何在一個oc專案中,加入一個swift頁面。實現從oc跳轉swift,從swift跳轉oc,頁面傳值。
第一步:專案配置,新增一個swift頁面

建立一個橋接檔案
OC檔案配置:

ViewController.m
在oc檔案中匯入:”專案名-Swift.h” 這個固定格式的檔案
即可使用
SwiftViewController *viewController=[[SwiftViewController alloc] init]; [self presentViewController:viewController animated:YES completion:nil];
oc向swift頁面傳參:
在swift頁面定義一個變數,

Swift定義一個變數
在oc頁面中
SwiftViewController *viewController=[[SwiftViewController alloc] init]; viewController.type=@"abc"; [self presentViewController:viewController animated:YES completion:nil];
在swift頁面中,即可獲取這個變數
Swift頁面配置:
想要在Swift頁面呼叫OC頁面的方法,必須先在之前建立好的橋接檔案中加入這個OC檔案

橋接檔案配置
首先在Swift頁面中新增一個tableView:

Swift中新增一個UITableView
相關UITableView程式碼如下:
import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ var table:UITableView! let arry:[String] = ["資料1", "資料2", "資料3"] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //設定UITableView的位置 let rect = self.view.frame table = UITableView(frame: rect) self.table.backgroundColor = UIColor.white //設定資料來源 self.table.dataSource = self //設定代理 self.table.delegate = self self.view.addSubview(table) //註冊UITableView,cellID為重複使用cell的Identifier self.table.register(UITableViewCell.self, forCellReuseIdentifier: "cellID") } /* @注意:我們前邊的ViewController繼承了UITableViewDataSource @和 UITableViewCelegate。如果我們不註冊下面的三個方法XCode就會報錯!!! */ //設定cell的數量 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return arry.count } //設定section的數量 func numberOfSections(in tableView: UITableView) -> Int { return 1 } //設定tableview的cell func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = (table.dequeueReusableCell(withIdentifier: "cellID", for: indexPath)) as UITableViewCell cell.textLabel?.text = arry[indexPath.row] return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
swift向oc頁面反向傳值:
反向傳值,我們可以使用代理,通知中心,block等方式實現,下面我就以代理回撥為例,演示一下如何從swift向oc頁面反向傳值。
swift頁面:
新增一個協議
@objc (DidSelectDelegate) protocol DidSelectDelegate { func backStrData(str:String) }
定義一個遵循協議的myDelegate物件
@objc var myDelegate:DidSelectDelegate?;
點選某一行cell,將資料傳回上一個OC頁面
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let string = arry[indexPath.row] self.myDelegate?.backStrData(str: string) self.dismiss(animated: true, completion: nil) }
OC頁面:
遵循協議
@interface ViewController ()<DidSelectDelegate>
簽訂協議
viewController.myDelegate=self;
實現回撥方法
- (void)backStrDataWithStr:(NSString *)str { NSLog(@"%@", str); }
至此,我們就可以在一個oc專案中,加入了一個帶有UITableView的Swift頁面,並完成了雙向傳值。