oc swift 中_oc中混合swift - CSDN
  • 本文章将从两个方向分别... 1 如何在swift的类中使用oc类 1.2 如何在swift中实现oc的代理方法 1.3 如何在swift中实现oc的Block回调 2 二个方向从OC工程中引入swift类    2.1 如何在OC类中使用swift类 2.2 如何...

     

    本文章将从两个方向分别介绍 OC 与 swift 混编  

    1. 第一个方向从 swift工程 中引入 oc类 

      1. 1 如何在swift的类中使用oc类
        1.2  如何在swift中实现oc的代理方法
        1.3   如何在swift中实现oc的Block回调

    2 二个方向从OC工程中引入swift类

     

        2.1  如何在OC类中使用swift类
        2.2   如何在OC中实现swift的代理方法
        2.3   如何在OC中实现swift中类似Block回调

     

     

    下面是具体的实现过程:

     1.1  如何在swift的类中使用oc类? 

    1.  swift工程中引入OC类。 具体实现过程。

        1.1 新建一个swift工程类。 取名 swiftOrOC

        1.2  实现的功能为 :  从swift. viewController.swift 中 push到 OC语言 secondViewController 控制器

    1.2.1  新建SecondViewController 类 。

            

         1.2.2 建立桥接文件。 (很重要)

     

        一定要记得点击这个按钮。 

           1.2.3  接下来工程目录如下:

           

         1.2.4 接下来就可以实现具体的跳转功能了。 

          ViewController.swift中具体实现

         

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var hintLabel: UILabel!  //稍后用来显示回调
        
        // push 到 oc controller
        @IBAction func pushAction(_ sender: AnyObject) {
            let secondVC = SecondViewController.init()
            self.navigationController?.pushViewController(secondVC, animated: true)
        }
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }

     

     

    1.2 如何在swift中实现oc的代理方法

           1.2.1 首先在 SecondViewController.h 中声明一个协议。具体代码

            

    #import <UIKit/UIKit.h>
    
    @protocol SecondDelegate <NSObject>
    
    -(void)refreshHintLabel:(NSString *)hintString;
    
    @end
    
    @interface SecondViewController : UIViewController
    
    @property (nonatomic,weak)id<SecondDelegate> secondDelegate;
    @end

     

     

      1.2.3 接下来就非常简单了,让ViewController.swift只需要成为SecondViewController的代理,然后遵循她的协议,就可以了。 具体代码如下。

     

           1.2.3.1 遵循协议

      

         1.2.3.2 成为代理,并实现协议方法,更改controller.swift中hintLabel的text。

    [objc] view plain copy
     
    1. // push 到 oc controller  
    2. @IBAction func pushAction(_ sender: AnyObject) {  
    3.     let secondVC = SecondViewController.init()  
    4.     secondVC.secondDelegate = self;  
    5.     self.navigationController?.pushViewController(secondVC, animated: true)  
    6. }  
    7.   
    8. // SecondViewControll的代理方法  
    9. func refreshHintLabel(_ hintString: String!) {  
    10.     hintLabel.text = "secondView textView.text = " + hintString;  
    11. }  

     

     

     

     1.3   如何在swift中实现oc的Block回调

    1.3.1 具体过程与1.2小节一样。 直接上代码。

     

            1.3.2 声明block;

             

    [objc] view plain copy
     
    1. typedef void(^RefreshHintLabelBlock)(NSString *hintString);  
    2.   
    3. @interface SecondViewController : UIViewController  
    4. @property (nonatomic, copy) RefreshHintLabelBlock hintBlock;  
    5. @end  

     

     

            1.3.3 block的回调。 SecondViewController.m中

     

    [objc] view plain copy
     
    1. #pragma mark 返回上一页回调 ,将用户输入的用户名传回给 ViewController.swift  
    2. -(BOOL)navigationShouldPopOnBackButton{      
    3.     if (_hintBlock) {  
    4.         _hintBlock(textField.text);  
    5.     }  
    6.     return YES;  
    7. }  

     

     

            1.3.4 在swift类中调用 oc的block.

     

    [objc] view plain copy
     
    1. // push 到 oc controller  
    2. @IBAction func pushAction(_ sender: AnyObject) {  
    3.     let secondVC = SecondViewController.init()  
    4.       secondVC.secondDelegate = self;  
    5.     secondVC.hintBlock = {(t:String?)in  
    6.         self.hintLabel.text = "secondView textView.text = " + t!  
    7.     }  
    8.     self.navigationController?.pushViewController(secondVC, animated: true)  
    9. }  



     

       工程已上传到git上,git地址: https://github.com/zhonggaorong/SwiftOrOc/tree/master

    2.  OC工程中引入swift类。 具体实现过程。

        耽误了不少时间, 今天才开始写oc工程中引入swift类。

        demo地址: 

      

     

         2.1  如何在OC类中使用swift类

     
           2.1.1   新建一个基于OC语言的工程 ,取名 OcOrSwiftTwo
           2.1. 2  实现的功能为 : 从oc类 viewcontroller中, push 至 swift语言 SecondViewController  ,然后SecondViewController可以通过代理或者swift闭包把值传回viewcontroller. 
           2.1.3   当前文件目录看下图:  (第四个箭头: 桥接文件)
            

      
        2.2   如何在OC中实现swift的代理与闭包Block方法
                
        2.2.1 如何在oc中引入swift类。#import "工程名-swift.h"
    [objc] view plain copy
     
    1. #import "OcOrSwiftTwo-swift.h"  
       2.2.2 在secondViewController.swift 中实现代理与闭包,代码如下:
        注意: @objc(代理名)  才能在外部可见这个代理
     
    [objc] view plain copy
     
    1. import UIKit  
    2. import Foundation  
    3.   
    4. // 必须加上@objc 代理才能在oc类中可见。  
    5. @objc(EditTextFieldDelegate)  
    6. protocol EditTextFieldDelegate:NSObjectProtocol {  
    7.     func editTextField(_ str: String) -> Void  
    8. }  
    9.   
    10. @objc(SecondViewController)  
    11. class SecondViewController: UIViewController {  
    12.   
    13.     var editorDelegate:EditTextFieldDelegate?  
    14.     var textField:UITextField?  
    15.     var addButton:UIButton?  
    16.     var pushButton:UIButton?  
    17.       
    18.     typealias editorBlock = (_ t:String) -> Void  
    19.     var myEidtorBlock:editorBlock?  
    20.       
    21.     override func viewDidLoad() {  
    22.         super.viewDidLoad()  
    23.         self.view.backgroundColor = UIColor.white  
    24.         textField = UITextField.init(frame: CGRect.init(x: 50, y: 60, width: 200, height: 50))  
    25.         textField?.placeholder = "输入返回首页的内容"  
    26.         self.view.addSubview(textField!)  
    27.           
    28.         addButton = UIButton.init(type: .custom)  
    29.         addButton?.setTitleColor(UIColor.black, for: .normal)  
    30.         addButton?.setTitle("pop", for: .normal)  
    31.         addButton?.frame = CGRect.init(x: 50, y: 150, width: 200, height: 50)  
    32.         addButton?.layer.borderColor = UIColor.black.cgColor  
    33.         addButton?.layer.borderWidth = 1.0  
    34.         addButton?.addTarget(self, action: #selector(popAction), for: .touchUpInside)  
    35.         self.view.addSubview(addButton!)  
    36.           
    37.           
    38.           
    39.         pushButton = UIButton.init(type: .custom)  
    40.         pushButton?.setTitleColor(UIColor.black, for: .normal)  
    41.         pushButton?.setTitle("push", for: .normal)  
    42.         pushButton?.frame = CGRect.init(x: 50, y: 250, width: 200, height: 50)  
    43.         pushButton?.layer.borderColor = UIColor.black.cgColor  
    44.         pushButton?.layer.borderWidth = 1.0  
    45.         pushButton?.addTarget(self, action: #selector(pushAction), for: .touchUpInside)  
    46.         self.view.addSubview(pushButton!)  
    47.           
    48.     }  
    49.       
    50.     func popAction() -> Void {  
    51.           
    52.         if editorDelegate != nil {  
    53.             editorDelegate?.editTextField((textField?.text)!)  
    54.         }  
    55.           
    56.         if ((self.myEidtorBlock) != nil){  
    57.             self.myEidtorBlock!((textField?.text!)!)  
    58.         }  
    59.           
    60.         self.navigationController?.popViewController(animated: true)  
    61.     }  
    62.       
    63.       
    64.     func pushAction() -> Void {  
    65.         let three = ThreeViewController.init()  
    66.         self.navigationController?.pushViewController(three, animated: true)  
    67.           
    68.     }       
        2.2.3   在oc类中viewcontroller.m 文件中实现SecondviewController.swift的相关代理与闭包(block). 代码如下:
       
    [objc] view plain copy
     
    1. #import "ViewController.h"  
    2. #import "OcOrSwiftTwo-swift.h"  
    3.   
    4. @interface ViewController ()<EditTextFieldDelegate>  
    5. @property (nonatomic, strong) UITextField *showTextField;  
    6. @property (nonatomic, strong) UIButton *pushButton;  
    7.   
    8. @end  
    9.   
    10. @implementation ViewController  
    11.   
    12. - (void)viewDidLoad {  
    13.     [super viewDidLoad];  
    14.     _showTextField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100 , 200, 50)];  
    15.     _showTextField.placeholder = @"swift传回的文本内容";  
    16.     _showTextField.adjustsFontSizeToFitWidth = YES;  
    17.     _showTextField.enabled = NO;  
    18.     [self.view addSubview:_showTextField];  
    19.       
    20.     _pushButton = [UIButton buttonWithType:UIButtonTypeCustom];  
    21.     [_pushButton.layer setBorderColor:[UIColor blackColor].CGColor];  
    22.     [_pushButton.layer setBorderWidth:1.0];  
    23.     [_pushButton setFrame:CGRectMake(50, 200, 200, 50)];  
    24.     [_pushButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  
    25.     [_pushButton setTitle:@"push" forState:UIControlStateNormal];  
    26.     [_pushButton addTarget:self action:@selector(pushAction) forControlEvents:UIControlEventTouchUpInside];  
    27.       
    28.     [self.view addSubview:_pushButton];  
    29. }  
    30.   
    31.   
    32.   
    33.   
    34. -(void)pushAction{  
    35.     SecondViewController *second = [[SecondViewController alloc]init];  
    36.     // second.editorDelegate = self;  
    37.       
    38.     /* 
    39.       swift中的闭包回滴 
    40.      */  
    41.     second.myEidtorBlock = ^(NSString *str) {  
    42.         _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];  
    43.     };  
    44.     [self.navigationController pushViewController:second animated:YES];  
    45. }  
    46.   
    47. #pragma mark swift中的代理  
    48. -(void)editTextField:(NSString *)str{  
    49.     _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];  
    50. }  
    51.   
    52. - (void)didReceiveMemoryWarning {  
    53.     [super didReceiveMemoryWarning];  
    54.     // Dispose of any resources that can be recreated.  
    55. }  
    展开全文
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?...最新一些学妹问起,所以抽点时间来写的,适合入门...1. 第一个方向从 swift工程 引入 oc类   1. 1 如何在swift的类使用oc类  1.2 如何在s
    
    

    目录(?)[+]

    最新一些学妹问起,所以抽点时间来写的,适合入门级别的swift 与 OC 混编 的程序猿。  

    本文章将从两个方向分别介绍 OC 与 swift 混编  


    1. 第一个方向从 swift工程 中引入 oc类 

        1. 1 如何在swift的类中使用oc类
        1.2  如何在swift中实现oc的代理方法
        1.3   如何在swift中实现oc的Block回调

    2. 第二个方向从OC工程中引入swift类

        2.1  如何在OC类中使用swift类
        2.2   如何在OC中实现swift的代理方法
        2.3   如何在OC中实现swift中类似Block回调


    下面是具体的实现过程:

     1.1  如何在swift的类中使用oc类? 

    1.  Swift工程中引入OC类。 具体实现过程。

        1.1 新建一个swift工程类。 取名 swiftOrOC

        1.2  实现的功能为 :  从swift. viewController.swift 中 push到 OC语言 secondViewController 控制器

    1.2.1  新建SecondViewController 类 。

            

         1.2.2 建立桥接文件。 (很重要)


        一定要记得点击这个按钮。 

           1.2.3  接下来工程目录如下:

           

         1.2.4 接下来就可以实现具体的跳转功能了。 

          ViewController.swift中具体实现

         

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. import UIKit  
    2.   
    3. class ViewController: UIViewController {  
    4.   
    5.     @IBOutlet weak var hintLabel: UILabel!  //稍后用来显示回调  
    6.       
    7.     // push 到 oc controller  
    8.     @IBAction func pushAction(_ sender: AnyObject) {  
    9.         let secondVC = SecondViewController.init()  
    10.         self.navigationController?.pushViewController(secondVC, animatedtrue)  
    11.     }  
    12.       
    13.     override func viewDidLoad() {  
    14.         super.viewDidLoad()  
    15.         // Do any additional setup after loading the view, typically from a nib.  
    16.     }  
    17.   
    18.     override func didReceiveMemoryWarning() {  
    19.         super.didReceiveMemoryWarning()  
    20.         // Dispose of any resources that can be recreated.  
    21.     }  
    22.   
    23.   
    24. }  


    1.2 如何在swift中实现oc的代理方法

           1.2.1 首先在 SecondViewController.h 中声明一个协议。具体代码

            

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. #import <UIKit/UIKit.h>  
    2.   
    3. @protocol SecondDelegate <NSObject>  
    4.   
    5. -(void)refreshHintLabel:(NSString *)hintString;  
    6.   
    7. @end  
    8.   
    9. @interface SecondViewController : UIViewController  
    10.   
    11. @property (nonatomic,weak)id<SecondDelegate> secondDelegate;  
    12. @end  
         1.2.2 然后在SecondViewController.m中,通过一个UITextField,让用户输入内容,当用户点击返回的时候把输入框中的内容返回给对应的代理。具体代码如下

        

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. #import "SecondViewController.h"  
    2. #import "UIViewController+BackButtonHandler.h"  
    3.   
    4. @interface SecondViewController ()  
    5. {  
    6.     UITextField *textField;  
    7. }  
    8. @end  
    9.   
    10. @implementation SecondViewController  
    11.   
    12. - (void)viewDidLoad {  
    13.     [super viewDidLoad];  
    14.     self.title = @"oc";  
    15.       
    16.     self.view.backgroundColor  = [UIColor whiteColor];  
    17.       
    18.     textField = [[UITextField alloc]initWithFrame:CGRectMake(100100200200)];  
    19.     textField.placeholder = @"请输入用户名";  
    20.     [self.view addSubview:textField];  
    21.     [textField.layer setBorderColor:[UIColor blackColor].CGColor];  
    22.     [textField.layer setBorderWidth:1.0];  
    23.   
    24.       
    25. }  
    26.   
    27. -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  
    28.     [self.view endEditing:YES];  
    29. }  
    30. #pragma mark 返回上一页回调 ,将用户输入的用户名传回给 ViewController.swift  
    31. -(BOOL)navigationShouldPopOnBackButton{  
    32.     if ([_secondDelegate respondsToSelector:@selector(refreshHintLabel:)]) {  
    33.         [_secondDelegate refreshHintLabel: textField.text];  
    34.     }  
    35.       
    36.     return YES;  
    37. }  
    38.   
    39.   
    40. - (void)didReceiveMemoryWarning {  
    41.     [super didReceiveMemoryWarning];  
    42.     // Dispose of any resources that can be recreated.  
    43. }  
    44.   
    45. /* 
    46. #pragma mark - Navigation 
    47.  
    48. // In a storyboard-based application, you will often want to do a little preparation before navigation 
    49. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    50.     // Get the new view controller using [segue destinationViewController]. 
    51.     // Pass the selected object to the new view controller. 
    52. } 
    53. */  
    54.   
    55. @end  
      1.2.3 接下来就非常简单了,让ViewController.swift只需要成为SecondViewController的代理,然后遵循她的协议,就可以了。 具体代码如下。

           1.2.3.1 遵循协议

      

         1.2.3.2 成为代理,并实现协议方法,更改controller.swift中hintLabel的text。

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // push 到 oc controller  
    2. @IBAction func pushAction(_ sender: AnyObject) {  
    3.     let secondVC = SecondViewController.init()  
    4.     secondVC.secondDelegate = self;  
    5.     self.navigationController?.pushViewController(secondVC, animatedtrue)  
    6. }  
    7.   
    8. // SecondViewControll的代理方法  
    9. func refreshHintLabel(_ hintString: String!) {  
    10.     hintLabel.text = "secondView textView.text = " + hintString;  
    11. }  

     1.3   如何在swift中实现oc的Block回调

    1.3.1 具体过程与1.2小节一样。 直接上代码。

            1.3.2 声明block;

             

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. typedef void(^RefreshHintLabelBlock)(NSString *hintString);  
    2.   
    3. @interface SecondViewController : UIViewController  
    4. @property (nonatomiccopy) RefreshHintLabelBlock hintBlock;  
    5. @end  

            1.3.3 block的回调。 SecondViewController.m中

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. #pragma mark 返回上一页回调 ,将用户输入的用户名传回给 ViewController.swift  
    2. -(BOOL)navigationShouldPopOnBackButton{      
    3.     if (_hintBlock) {  
    4.         _hintBlock(textField.text);  
    5.     }  
    6.     return YES;  
    7. }  

            1.3.4 在swift类中调用 oc的block.

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // push 到 oc controller  
    2. @IBAction func pushAction(_ sender: AnyObject) {  
    3.     let secondVC = SecondViewController.init()  
    4.       secondVC.secondDelegate = self;  
    5.     secondVC.hintBlock = {(t:String?)in  
    6.         self.hintLabel.text = "secondView textView.text = " + t!  
    7.     }  
    8.     self.navigationController?.pushViewController(secondVC, animatedtrue)  
    9. }  


       工程已上传到Git上,git地址: https://github.com/zhonggaorong/SwiftOrOc/tree/master

    2.  OC工程中引入swift类。 具体实现过程。

        耽误了不少时间, 今天才开始写oc工程中引入swift类。

        demo地址: 

      

         2.1  如何在OC类中使用swift类


           2.1.1   新建一个基于OC语言的工程 ,取名 OcOrSwiftTwo
           2.1. 2  实现的功能为 : 从oc类 viewcontroller中, push 至 swift语言 SecondViewController  ,然后SecondViewController可以通过代理或者swift闭包把值传回viewcontroller. 
           2.1.3   当前文件目录看下图:  (第四个箭头: 桥接文件)
            
      
        2.2   如何在OC中实现swift的代理与闭包Block方法
                
        2.2.1 如何在oc中引入swift类。#import "工程名-swift.h"
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. #import "OcOrSwiftTwo-swift.h"  
       2.2.2 在secondViewController.swift 中实现代理与闭包,代码如下:
        注意: @objc(代理名)  才能在外部可见这个代理
     
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. import UIKit  
    2. import Foundation  
    3.   
    4. // 必须加上@objc 代理才能在oc类中可见。  
    5. @objc(EditTextFieldDelegate)  
    6. protocol EditTextFieldDelegate:NSObjectProtocol {  
    7.     func editTextField(_ str: String) -> Void  
    8. }  
    9.   
    10. @objc(SecondViewController)  
    11. class SecondViewController: UIViewController {  
    12.   
    13.     var editorDelegate:EditTextFieldDelegate?  
    14.     var textField:UITextField?  
    15.     var addButton:UIButton?  
    16.     var pushButton:UIButton?  
    17.       
    18.     typealias editorBlock = (_ t:String) -> Void  
    19.     var myEidtorBlock:editorBlock?  
    20.       
    21.     override func viewDidLoad() {  
    22.         super.viewDidLoad()  
    23.         self.view.backgroundColor = UIColor.white  
    24.         textField = UITextField.init(frame: CGRect.init(x: 50, y60, width200, height50))  
    25.         textField?.placeholder = "输入返回首页的内容"  
    26.         self.view.addSubview(textField!)  
    27.           
    28.         addButton = UIButton.init(type: .custom)  
    29.         addButton?.setTitleColor(UIColor.black, for.normal)  
    30.         addButton?.setTitle("pop", for.normal)  
    31.         addButton?.frame = CGRect.init(x: 50, y150, width200, height50)  
    32.         addButton?.layer.borderColor = UIColor.black.cgColor  
    33.         addButton?.layer.borderWidth = 1.0  
    34.         addButton?.addTarget(self, action: #selector(popAction), for.touchUpInside)  
    35.         self.view.addSubview(addButton!)  
    36.           
    37.           
    38.           
    39.         pushButton = UIButton.init(type: .custom)  
    40.         pushButton?.setTitleColor(UIColor.black, for.normal)  
    41.         pushButton?.setTitle("push", for.normal)  
    42.         pushButton?.frame = CGRect.init(x: 50, y250, width200, height50)  
    43.         pushButton?.layer.borderColor = UIColor.black.cgColor  
    44.         pushButton?.layer.borderWidth = 1.0  
    45.         pushButton?.addTarget(self, action: #selector(pushAction), for.touchUpInside)  
    46.         self.view.addSubview(pushButton!)  
    47.           
    48.     }  
    49.       
    50.     func popAction() -> Void {  
    51.           
    52.         if editorDelegate != nil {  
    53.             editorDelegate?.editTextField((textField?.text)!)  
    54.         }  
    55.           
    56.         if ((self.myEidtorBlock) != nil){  
    57.             self.myEidtorBlock!((textField?.text!)!)  
    58.         }  
    59.           
    60.         self.navigationController?.popViewController(animated: true)  
    61.     }  
    62.       
    63.       
    64.     func pushAction() -> Void {  
    65.         let three = ThreeViewController.init()  
    66.         self.navigationController?.pushViewController(three, animatedtrue)  
    67.           
    68.     }       
        2.2.3   在oc类中viewcontroller.m 文件中实现SecondviewController.swift的相关代理与闭包(block). 代码如下:
       
    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. #import "ViewController.h"  
    2. #import "OcOrSwiftTwo-swift.h"  
    3.   
    4. @interface ViewController ()<EditTextFieldDelegate>  
    5. @property (nonatomicstrongUITextField *showTextField;  
    6. @property (nonatomicstrongUIButton *pushButton;  
    7.   
    8. @end  
    9.   
    10. @implementation ViewController  
    11.   
    12. - (void)viewDidLoad {  
    13.     [super viewDidLoad];  
    14.     _showTextField = [[UITextField alloc]initWithFrame:CGRectMake(50100 , 20050)];  
    15.     _showTextField.placeholder = @"swift传回的文本内容";  
    16.     _showTextField.adjustsFontSizeToFitWidth = YES;  
    17.     _showTextField.enabled = NO;  
    18.     [self.view addSubview:_showTextField];  
    19.       
    20.     _pushButton = [UIButton buttonWithType:UIButtonTypeCustom];  
    21.     [_pushButton.layer setBorderColor:[UIColor blackColor].CGColor];  
    22.     [_pushButton.layer setBorderWidth:1.0];  
    23.     [_pushButton setFrame:CGRectMake(5020020050)];  
    24.     [_pushButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  
    25.     [_pushButton setTitle:@"push" forState:UIControlStateNormal];  
    26.     [_pushButton addTarget:self action:@selector(pushAction) forControlEvents:UIControlEventTouchUpInside];  
    27.       
    28.     [self.view addSubview:_pushButton];  
    29. }  
    30.   
    31.   
    32.   
    33.   
    34. -(void)pushAction{  
    35.     SecondViewController *second = [[SecondViewController alloc]init];  
    36.     // second.editorDelegate = self;  
    37.       
    38.     /* 
    39.       swift中的闭包回滴 
    40.      */  
    41.     second.myEidtorBlock = ^(NSString *str) {  
    42.         _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];  
    43.     };  
    44.     [self.navigationController pushViewController:second animated:YES];  
    45. }  
    46.   
    47. #pragma mark swift中的代理  
    48. -(void)editTextField:(NSString *)str{  
    49.     _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];  
    50. }  
    51.   
    52. - (void)didReceiveMemoryWarning {  
    53.     [super didReceiveMemoryWarning];  
    54.     // Dispose of any resources that can be recreated.  
    55. }  

    展开全文
  • OC代码使用Swift文件的实践

    千次阅读 2018-05-31 11:32:11
    今天研究了一下如何在OC项目使用swift文件,即OCswift的混编问题,发现在OC中要使用swift文件也是蛮简单的,实践过程列如下: 1)首先随便创建了一个OC项目,就叫 DetialViewDemo 2)因为Swift的代码默认是...

    最近在研究swift,就我看来,swift确实是比OC更优秀的语言,这可以体现在很多方面,网上已经对比的很透彻,就不一一赘述。
    今天研究了一下如何在OC项目中使用swift文件,即OC和swift的混编问题,发现在OC中要使用swift文件也是蛮简单的,实践过程列如下:
    1)首先随便创建了一个OC项目,就叫 DetialViewDemo
    这里写图片描述
    2)因为Swift的代码默认是使用module管理的,所以两者混编的最重要的一步,就是把我们的Swift代码作为一个module暴露给OC工程,具体步骤如下:
    这里写图片描述
    3)创建一个swift文件或者将已有的swift文件拖入项目中,我这里是拖入了一个练习swift写的一个类:
    这里写图片描述
    注意点:swift文件添加的时候会提示是否添加桥接文件,直接点击不创建就OK
    4)好了,文件都准备好了,接下来就需要在使用到swift文件的类中引入”Product Module Name-Swift.h”,其中Product Module Name其实就是项目的名称,这个在上面配置Module的图中也能看到,然后我们就可以愉快地和swift进行玩耍了
    这里写图片描述
    注意:引入Product Module Name-Swift.h的时候不一定自动提示,手写之后编译就可以了

    当然,我很好奇这是怎么回事,然后我就command+点击 Person 进入了内部查看,发现原来苹果将所有的swift文件中的代码转成了oc的代码,不管你引入多少个swift文件,都会一股脑在Product Module Name-Swift.h文件中翻译成oc文件以便我们oc程序调用
    这里写图片描述

    怎么样,很强大吧,朋友们赶紧转过来吧,开始自己的swift开发,这绝对是苹果的未来啊!

    展开全文
  • OC中使用Swift混编引入头文件

    千次阅读 2018-05-22 13:22:09
    上篇讲了Swift中使用OCSwift中使用OC,这篇讲下OC中使用Swift类。 在OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。 特别注意 1、被使用的Swift的类必须是至少继承自NSObject...

    Swift中引用OC看这篇
    在OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。

    特别注意
    1、被使用的Swift的类必须是至少继承自NSObject的,不然OC识别不了这个类。
    2、Swift中的属性和方法,要加上@objc标识,不然识别不了。

    代码如下,Swift中定义了一个类,这个类有一个类属性和一个类方法。

    class UUUU:NSObject {
        @objc static var yyy:String?
        @objc static func test()->(){
            print("XXXX")
        }
    }

    在OC需要用到的地方先引入#import “XXX-Swift.h”,然后就能用了

        UUUU *u  =[UUUU new];
        NSLog(@"%@" , UUUU.yyy);
        [UUUU test];

    Swift中使用类属性和类方法代替宏定义

    另外,在Swift的类中,可以使用只读的类属性和类方法来代替OC中的宏定义,这样定义的宏在OC中直接用,省略了在oc中再定义一次的麻烦。代码如下

    class UUUU:NSObject {
        //只读的类属性
        @objc static var name:String{
            return "jim"
        }
        //类方法
        @objc static func RGBColor(r:Float , g:Float , b:Float) -> UIColor {
            return UIColor.init(red: (CGFloat(r/255.0)), green: (CGFloat(r/255.0)), blue: (CGFloat(r/255.0)), alpha: 1.0)
        }
    }

    另一种Swift代替宏定义的方法是使用全局变量和全局函数来定义,Swift中使用全局变量和函数代替宏

    展开全文
  • OC Swift 混编

    2017-08-30 13:29:01
    首先承认我落后了,到今天才开始在项目里用swift,而且还不是全部的用,只是ocswift混编,因为实在是进入项目的时候框架已经用oc搭好了啊啊啊啊啊。只能退而求其次,混编了,大致根据百度到的方法试了一下,不是很...
  • OC项目使用Swift

    万次阅读 2016-02-27 09:23:30
    OC项目使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue 独立博客:http://mengxiangyue.com 最近公司的项目开始计划使用Swift,由于原先的工程都是使用...
  • 之前在开发是遇到了在OC文件调用Swift对象的变量调用不到的问题,这里总结一下: 1.首先我们一个Swift项目TestProject。 2.建立一个Swift的文件继承自NSObject名字为SwiftFile.swift,并声明一个字符串变量...
  • oc中调用swift中的struct

    千次阅读 2016-09-05 10:26:53
    oc中调用swift中的struct  在oc中是不能调用struct里面的内容的,你想在类似class前面加个@objc的方法加在struct前面,你是发现是不行的,那但是我们又想在oc中调用struct的属性,那怎么办呢?我们只能够再建一...
  • iOS开发实现OCSwift的混编

    千次阅读 2018-04-18 17:14:32
    最近又开始看了一些关于Swift的视频、博客、书,发现swift相对于OC使用起来更简洁了,于是就想在原有项目引入swift。原有的项目都是使用OC写的,既然要在原有项目引入swift文件首先就要实现OCswift的混编设置...
  • 第一步: 导入你需要用到的OC文件 第二步: 创建一个 HeaderFile 文件, 一般命名为: 项目名-Bridge.h 第三步: 在HeaderFile文件添加对应OC文件的.h文件, 用作桥接 第四步: 在工程的 BuildSetting 配置桥接文件...
  • [Swift]1.在OC项目里的OC代码调用Swift方法,Swift代码里调用OC代码。2.在Swift项目里的Swift代码里调用OC代码,OC代码调用Swift方法。
  • ...在OC中使用Swift 1.首先创建一个工程名字就叫做CHWTest1 2.在工程的Build Setting把Defines Module改为YES,如图 3.把Product Name设为工程的名字,如图 4
  • OCswift混编(桥接)

    2018-10-10 14:49:59
    所谓桥接就是在OC 工程第一次创建swift文件的时候回生成一个头文件(Bridging-Header.h 桥)。 这里主要是swift 调用OC方法的时候引入OC文件.h 所使用的   第一次在OC工程创建swift文件生成的桥 头文件, ...
  • swift中使用OC的方法;在OC中调用swift方法
  • 问题:新建swift文件时,笔者的Xcode没有提示生成桥接文件,需要自己配置并手动创建桥接文件,最后在OC中成功引用swift写的类 项目说明:没有使用framework与pod 重要的配置及文件认识 Target–Building Setting...
  • OCswift区别

    2019-04-03 10:07:42
    swift中oc中没有的类 比如 元组 有泛型 3.因为swift 定义的常亮和变量是没有值的,所以引入了可选的概念,这时候 如果swift没有值的话 就用optional 4.在swift 中,let 声明的常量的值不能改变 var 生命的变量的...
  • oc使用swift中的枚举Enumeration is a data type that allows you to define a list of possible values. An enum allows you to create a data type with those set of values so that they can be recognised ...
  • 1. swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解。 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: ...在代理的头部加上 @objc...3. swift中的回
  • OCSwift如何相互调用

    2017-05-23 12:15:55
    文件是自动创建的在swift中调用OC代码使用的桥接文件,需要将在swift中使用的OC的相关头文件添加该此处
1 2 3 4 5 ... 20
收藏数 19,499
精华内容 7,799
关键字:

oc swift 中