oc调用swift_oc调用swift的常量 - CSDN
精华内容
参与话题
  • [Swift]1.在OC项目里的OC代码调用Swift方法,Swift代码里调用OC代码。2.在Swift项目里的Swift代码里调用OC代码,OC代码调用Swift方法。
  • OC 引用并调用Swift文件

    千次阅读 2019-07-24 17:09:03
    1、我们先创建一个OC的项目MyFirstOCUseSwiftDemo 2、我们点击Target看到右边选择Build Settings,把Defines Module改为YES, 3、我们回到工程目录下,New File一个Swift File,起名为MyFristSwift,此时会...

    1、我们先创建一个OC的项目MyFirstOCUseSwiftDemo

    2、我们点击Target看到右边选择Build Settings,把Defines Module改为YES,

    3、我们回到工程目录下,New File一个Swift File,起名为MyFristSwift,此时会弹框提示我们是否创建一个桥接文件,如图:

    4、创建好之后我们再次选择项目的Target看到右侧的Build Settings选项,往下滑动会看到这样一个目录:

    此时是系统为我们自动创建了桥接"项目名-Swift"文件和"项目名-Bridging-Header"文件;

    5、接下来我们开始创建自己的Swift文件,新建一个Swift起名为:MyFristSwift,它看起来应该长这样:

    import Foundation
    import UIKit
    
    
    class MyFristSwift: UIViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
         
            self.view.backgroundColor = UIColor.green
    
        }
        
        
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }

    6、接下来我们要在OC的控制器(也就是你想要调用Swift的OC控制器)里边import一下第四步图中展示的swift文件,此时注意的是这个头文件是手动写的,你也可以在第四步中复制Objcective-C Generated Interface Header Name对应的值;

    7、好了,这是最后一步,在OC控制器中 创建一个按钮进入我们的swift页面吧,它应该是这样的:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        //创建属于我们自己的按钮
        [self.view addSubview:self.nextBtn];
    
    }
    - (void)nextBtnClicked:(UIButton *)btn{
        // 使用Swift的类
        MyFristSwift *swiftVC = [[MyFristSwift alloc] init];
        [self presentViewController:swiftVC animated:YES completion:nil];
    }
    -(UIButton *)nextBtn{
        
        if (!_nextBtn) {
            
            _nextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            _nextBtn.frame = CGRectMake(40, 100, 100, 44);
            _nextBtn.layer.masksToBounds = YES;
            _nextBtn.layer.cornerRadius = 4;
            _nextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
            [_nextBtn setTitle:@"进入Swift" forState:UIControlStateNormal];
            [_nextBtn setBackgroundColor:[UIColor brownColor]];
            [_nextBtn addTarget:self action:@selector(nextBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
        }
        return _nextBtn;
    }
    

     

    展开全文
  • OC 调用 Swift 方法

    千次阅读 2018-09-06 11:47:34
    1.新建Swift文件之前做以下设置 2.创建Swift文件后,会提示创建桥接文件,点击创建 3.Swift 类 import Foundation class RealmManager: NSObject { override init() { super.init() } @objc func ...

    1.新建Swift文件之前做以下设置
    这里写图片描述

    2.创建Swift文件后,会提示创建桥接文件,点击创建

    3.Swift 类

    import Foundation
    
    class RealmManager: NSObject {
        override init() {
            super.init()
        }
        @objc func getConins() -> String {
            return "\(Setting.coins),\(Setting.currentLevel)"
        }
    }

    Swift的类必须继承NSObject 否则无法识别
    Swift的方法必须用@objc 修饰,否则,无法识别

    4.在OC中导入Swift引用
    、#import “plus-Swift.h”

    plus 就是上边截图的Product Name

    展开全文
  • 最新一些学妹问起,所以抽点时间来写的,适合入门级别的swiftOC 混编 的程序猿。 本文章将从两个方向分别介绍 OCswift 混编 1. 第一个方向从 swift工程 中引入 oc类   1. 1 如何在swift的类中使用oc类 ...

    最新一些学妹问起,所以抽点时间来写的,适合入门级别的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中具体实现

         

    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.2 然后在SecondViewController.m中,通过一个UITextField,让用户输入内容,当用户点击返回的时候把输入框中的内容返回给对应的代理。具体代码如下

        

    #import "SecondViewController.h"
    #import "UIViewController+BackButtonHandler.h"
    
    @interface SecondViewController ()
    {
        UITextField *textField;
    }
    @end
    
    @implementation SecondViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.title = @"oc";
        
        self.view.backgroundColor  = [UIColor whiteColor];
        
        textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
        textField.placeholder = @"请输入用户名";
        [self.view addSubview:textField];
        [textField.layer setBorderColor:[UIColor blackColor].CGColor];
        [textField.layer setBorderWidth:1.0];
    
        
    }
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        [self.view endEditing:YES];
    }
    #pragma mark 返回上一页回调 ,将用户输入的用户名传回给 ViewController.swift
    -(BOOL)navigationShouldPopOnBackButton{
        if ([_secondDelegate respondsToSelector:@selector(refreshHintLabel:)]) {
            [_secondDelegate refreshHintLabel: textField.text];
        }
        
        return YES;
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    /*
    #pragma mark - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
    
    @end
    
      1.2.3 接下来就非常简单了,让ViewController.swift只需要成为SecondViewController的代理,然后遵循她的协议,就可以了。 具体代码如下。

           1.2.3.1 遵循协议

      

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

        // push 到 oc controller
        @IBAction func pushAction(_ sender: AnyObject) {
            let secondVC = SecondViewController.init()
            secondVC.secondDelegate = self;
            self.navigationController?.pushViewController(secondVC, animated: true)
        }
        
        // SecondViewControll的代理方法
        func refreshHintLabel(_ hintString: String!) {
            hintLabel.text = "secondView textView.text = " + hintString;
        }
        

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

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

            1.3.2 声明block;

             

    typedef void(^RefreshHintLabelBlock)(NSString *hintString);
    
    @interface SecondViewController : UIViewController
    @property (nonatomic, copy) RefreshHintLabelBlock hintBlock;
    @end

            1.3.3 block的回调。 SecondViewController.m中

    #pragma mark 返回上一页回调 ,将用户输入的用户名传回给 ViewController.swift
    -(BOOL)navigationShouldPopOnBackButton{    
        if (_hintBlock) {
            _hintBlock(textField.text);
        }
        return YES;
    }
    

            1.3.4 在swift类中调用 oc的block.

        // push 到 oc controller
        @IBAction func pushAction(_ sender: AnyObject) {
            let secondVC = SecondViewController.init()
    //        secondVC.secondDelegate = self;
            secondVC.hintBlock = {(t:String?)in
                self.hintLabel.text = "secondView textView.text = " + t!
            }
            self.navigationController?.pushViewController(secondVC, animated: true)
        }


       工程已上传到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"
    #import "OcOrSwiftTwo-swift.h"
       2.2.2 在secondViewController.swift 中实现代理与闭包,代码如下:
        注意: @objc(代理名)  才能在外部可见这个代理
     
    import UIKit
    import Foundation
    
    // 必须加上@objc 代理才能在oc类中可见。
    @objc(EditTextFieldDelegate)
    protocol EditTextFieldDelegate:NSObjectProtocol {
        func editTextField(_ str: String) -> Void
    }
    
    @objc(SecondViewController)
    class SecondViewController: UIViewController {
    
        var editorDelegate:EditTextFieldDelegate?
        var textField:UITextField?
        var addButton:UIButton?
        var pushButton:UIButton?
        
        typealias editorBlock = (_ t:String) -> Void
        var myEidtorBlock:editorBlock?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            self.view.backgroundColor = UIColor.white
            textField = UITextField.init(frame: CGRect.init(x: 50, y: 60, width: 200, height: 50))
            textField?.placeholder = "输入返回首页的内容"
            self.view.addSubview(textField!)
            
            addButton = UIButton.init(type: .custom)
            addButton?.setTitleColor(UIColor.black, for: .normal)
            addButton?.setTitle("pop", for: .normal)
            addButton?.frame = CGRect.init(x: 50, y: 150, width: 200, height: 50)
            addButton?.layer.borderColor = UIColor.black.cgColor
            addButton?.layer.borderWidth = 1.0
            addButton?.addTarget(self, action: #selector(popAction), for: .touchUpInside)
            self.view.addSubview(addButton!)
            
            
            
            pushButton = UIButton.init(type: .custom)
            pushButton?.setTitleColor(UIColor.black, for: .normal)
            pushButton?.setTitle("push", for: .normal)
            pushButton?.frame = CGRect.init(x: 50, y: 250, width: 200, height: 50)
            pushButton?.layer.borderColor = UIColor.black.cgColor
            pushButton?.layer.borderWidth = 1.0
            pushButton?.addTarget(self, action: #selector(pushAction), for: .touchUpInside)
            self.view.addSubview(pushButton!)
            
        }
        
        func popAction() -> Void {
            
            if editorDelegate != nil {
                editorDelegate?.editTextField((textField?.text)!)
            }
            
            if ((self.myEidtorBlock) != nil){
                self.myEidtorBlock!((textField?.text!)!)
            }
            
            self.navigationController?.popViewController(animated: true)
        }
        
        
        func pushAction() -> Void {
            let three = ThreeViewController.init()
            self.navigationController?.pushViewController(three, animated: true)
            
        }     
        2.2.3   在oc类中viewcontroller.m 文件中实现SecondviewController.swift的相关代理与闭包(block). 代码如下:
       
    #import "ViewController.h"
    #import "OcOrSwiftTwo-swift.h"
    
    @interface ViewController ()<EditTextFieldDelegate>
    @property (nonatomic, strong) UITextField *showTextField;
    @property (nonatomic, strong) UIButton *pushButton;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        _showTextField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100 , 200, 50)];
        _showTextField.placeholder = @"swift传回的文本内容";
        _showTextField.adjustsFontSizeToFitWidth = YES;
        _showTextField.enabled = NO;
        [self.view addSubview:_showTextField];
        
        _pushButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [_pushButton.layer setBorderColor:[UIColor blackColor].CGColor];
        [_pushButton.layer setBorderWidth:1.0];
        [_pushButton setFrame:CGRectMake(50, 200, 200, 50)];
        [_pushButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [_pushButton setTitle:@"push" forState:UIControlStateNormal];
        [_pushButton addTarget:self action:@selector(pushAction) forControlEvents:UIControlEventTouchUpInside];
        
        [self.view addSubview:_pushButton];
    }
    
    
    
    
    -(void)pushAction{
        SecondViewController *second = [[SecondViewController alloc]init];
        // second.editorDelegate = self;
        
        /*
          swift中的闭包回滴
         */
        second.myEidtorBlock = ^(NSString *str) {
            _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];
        };
        [self.navigationController pushViewController:second animated:YES];
    }
    
    #pragma mark swift中的代理
    -(void)editTextField:(NSString *)str{
        _showTextField.text = [NSString stringWithFormat:@"second传回信息: %@",str];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    


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

    千次阅读 2018-05-31 11:32:11
    最近在研究swift,就我看来,swift确实是比OC更优秀的语言,这可以体现在很多方面,网上已经对比的很透彻,就不一一赘述。 今天研究了一下如何在OC项目中使用swift文件,即OCswift的混编问题,发现在OC中要使用...

    最近在研究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-06-03 09:27:48
    最近在项目中使用到了Swift语言写的第三方的框架,所以在这里将OC中使用Swift的方法说明一下。1.首先要在Build Setting中进行相关配置2.在Podfile文件中要加上use_frameworks!为什么要加use_frameworks!呢?首先需要...
  • swiftOC混编(方法调用

    万次阅读 2016-02-12 10:35:31
    OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(与你的项目配置相关,具体配置方式见上一篇文章) 2.OC类里仅可以调用public的Swift...
  • SwiftOC 互相调用

    千次阅读 2018-07-20 16:19:07
    Swift 调用 OC Swift 调用 OC 分为两种常见情况,一种是直接在 Application 的 project 中使用;另一种情况是,在 framework 开发中使用。 对于互相调用的原理,如下图所示,更详细的内容可以参考 《Using Swif ...
  • OC工程调用Swift方法

    万次阅读 2017-01-11 11:45:08
    1.建一个OC工程命名为SwiftOC 2.新建一个swfit文件命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名-Bridging-Header.h” 3.配置工程 设置Defines Module 为Yes ...
  • iOS OC项目调用Swift

    万次阅读 2017-03-17 13:51:27
    网上有很多关于OC项目中使用Swift类的方法,但是亲自试了之后,发现不够详细,多次尝试后,终于找出详细的方法。 现把方法和遇到的问题,记录下来,方便其他同仁借鉴.
  • oc调用swift: 需要在暴露出来的方法和属性上加@objc否则不可用。需要在工程配置里面做一些小改动。 具体设置和内容可以参考: https://www.jianshu.com/p/754396e7e1bd https://www.jianshu.com/...
  • Swift调用OC枚举

    千次阅读 2019-09-17 14:35:00
    OC中 typedef NS_ENUM (NSUInteger, EVDeviceType) { EVDeviceAudioCapture = 0, EVDeviceAudioPlayback = 1, EVDeviceVideoCapture = 2 }; Swift EVDeviceType.audioCapture
  • OC调用Swift方法

    千次阅读 2018-05-02 15:36:48
    第一步:创建桥接文件第二步:配置桥接文件第三步:创建pch文件并配置其路径 第四步:在pch文件中导入如下头文件,注意:...,这里的xxx就是第二步中的Module name, 注意不要写错了 第五步:OC中直接调用Swift...
  • 1. swiftoc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解。 2. 在swiftOC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部加上 @objc(代理...
  • Swift调用OC代理

    千次阅读 2019-09-17 14:51:16
    oc @protocol EVCommonDelegate <NSObject> @optional - (void)onLoginSucceed:(EVUserInfo *_Nonnull)user; @end swift class CloudLoginVC: UIViewController, EVEngineDelegate func onLoginSucceed...
  • swift项目中,OCswift文件相互调用

    千次阅读 2017-08-10 13:40:38
    有时候 ,我们会涉及到双向混合编程,特别是OC和swift的互相引用。   swift调用oc的方法: ...1、桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可) ...oc调用swift
  • oc调用swift中的struct

    千次阅读 2016-09-05 10:26:53
    oc调用swift中的struct  在oc中是不能调用struct里面的内容的,你想在类似class前面加个@objc的方法加在struct前面,你是发现是不行的,那但是我们又想在oc中调用struct的属性,那怎么办呢?我们只能够再建一...
  • 之前在开发是遇到了在OC文件中调用Swift对象的变量调用不到的问题,这里总结一下: 1.首先我们一个Swift项目TestProject。 2.建立一个Swift的文件继承自NSObject名字为SwiftFile.swift,并声明一个字符串变量...
  • OC项目中使用Swift

    万次阅读 2016-02-27 09:23:30
    OC项目中使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue 独立博客:http://mengxiangyue.com 最近公司的项目开始计划使用Swift,由于原先的工程都是使用...
  • 在项目里交叉使用SwiftOC

    万次阅读 2014-06-27 16:45:14
    SwiftOC的兼容性使得你可以在项目里使用Swift+OC的方式编写应用程序,称为混合+匹配(mix and match),用这种方式可以一边使用享受新语言的快速特性,一边无缝的接合你已有的OC代码(原文听起来好NB的样子,其实也就...
1 2 3 4 5 ... 20
收藏数 9,232
精华内容 3,692
关键字:

oc调用swift