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

    目录(?)[+]

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

    展开全文
  • Swift的字符串类型String,跟OC的NSString,在API设计上还是有较大差异 // 空字符串 var emptyStr1 = "" var emptyStr2 = String() var str: String = "1" // 拼接,jack_rose str.append("_2") // 重载运算符 + ...

    String

    • Swift的字符串类型String,跟OC的NSString,在API设计上还是有较大差异
    // 空字符串
    var emptyStr1 = ""
    var emptyStr2 = String()
    
    var str: String = "1"
    // 拼接,jack_rose
    str.append("_2")
    // 重载运算符 +
    str = str + "_3"
    // 重载运算符 +=
    str += "_4"
    // \() 插值
    str = "\(str)_5"
    // 长度,9, 1_2_3_4_5
    print(str.count)
    
    var str = "123456"
    print(str.hasPreifx("123")) // true
    print(str.hasSuffix("456")) // true
    
    • String的插入
    var str = "1_2"
    // 1_2_
    str.insert("_", at: str.endIndex)
    // 1_2_3_4
    str.insert(contentsOf: "3_4", at: str.endIndex)
    // 1666_2_3_4
    str.insert(contentsOf: "666", at:str.Index(afer: str.startIndex))
    // 1666_2_3_8884
    str.insert(contentsOf: "888", at:str.Index(afer: str.endIndex))
    // 1666hello_2_3_8884
    str.insert(contentsOf: "hello", at:str.Index(str.startIndex, offsetBy: 4))
    
    • String的删除
    // 666hello_2_3_8884
    str.remove(at: str.firstIndex(of: "1")!)
    // hello_2_3_8884
    str.removeAll { $@ == "6"}
    var range = str.index(str.endIndex, offsetBy: -4)..<str.index(before: str.endIndex)
    // hello_2_3_4
    str removeSubrange(range)
    

    Substring

    • String可以通过下标、prefix、suffix等截取子串,子串类型不是String,而是Substring
    var str = "1_2_3_4_5"
    // 1_2
    var substr1 = str.preifx(3)
    // 4_5
    var substr2 = str.suffix(3)
    // 1_2
    var range = str.startIndex..<str.index(str.startIndex, offsetBy: 3)
    var substr3 = str[range]
    
    // 最初的string,1_2_3_4_5
    print(substr3.base)
    
    // Substring -> String
    var str2 = String(substr3)
    
    • Substring和它的base,共享字符串数据
    • Substring发生修改或者转为String时,会重新分配薪的内存存储字符串数据
      在这里插入图片描述

    String与Character

    for c in "jack" { // c是Character 类型
        print(c)
    }
    var str = "jack"
    // c是Character 类型
    var c = str[str.startIndex]
    

    String相关的协议

    • BidirectionalCollection 协议包含的部分内容
    1. startIndex、endIndex属性、index方法
    2. String、Array 都遵守了这个协议
    • RangeReplaceableCollection协议包含的部分内容
    1. append、insert、remove 方法
    2. String、Array 都遵守了这个协议
    • Dictionary、Set 也有实现上述协议中的声明的一些方法,只是并没有遵守上述协议

    多行String

    在这里插入图片描述

    String与NSString

    • String与NSStrjng之间可以随时随时桥接转换
    • String不能桥接转换成NSMutableString
    • 如果你觉得String的API过于复杂难用,可以考虑将String转为NSString
    var str1: String = "jack"
    var str2: NSString = "rose"
    
    var str3 = str1 as NSString
    var str4 = str2 as String
    
    var str5 = str3.substring(with: NSRange(location: 0, length: 2))
    print(str5)
    
    • 比较字符串内容是否等价
    • String使用==运算符
    • NSString使用isEqual方法,也可以使用==运算符(本质还是调用了isEqual方法)

    Swift、OC桥接转换表

    在这里插入图片描述

    展开全文
  • OCswift相互调用

    2017-04-26 11:39:33
    一、OC调用swift文件 二、swift调用OC文件 三、注意和总结 添加: 四、自定义桥接文件  一、OC调用swift文件  在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定...

    一、OC调用swift文件

    二、swift调用OC文件

    三、注意和总结

    添加:

    四、自定义桥接文件 

    一、OC调用swift文件

      在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定创建桥接文件,Xcode会自动创建一个桥接文件

    名字:工程名-Bridging-Header.h

    这个桥接文件是 swift 调用OC文件的时候用的

    1、

      进入TARGETS ->Build Settings -> Packaging 中

    设置Defines Module为YES

    设置 Product Module Name ,也可以不设置,默认为工程的名字。这个在后面会用到

    2、

      在swift写一个类

    注意这个类一定要继承NSObject,不然在OC中没法用

    class hello: NSObject {

        var address : String
        var gender: String
       
        init(address:String,gender:String){
            self.address = address
            self.gender = gender
        }
       
        func method() {
            print("message \(self.address + self.gender)")
        }
    }

    3、

      在OC需要用到的swift文件中 导入文件 "Product Module Name -Swift.h"  因为 Product Module Name 默认是工程的名字

    所以直接导入 #import "工程名-Swift.h"

    4、

      记着写完先command +B编译一下,如果没有报错就可以在OC文件调用swift中的类了

    hello *helloss = [[helloalloc]initWithAddress:@"上海"gender:@"男"];
    [helloss method];

     

    二、swift调用OC文件

      在swift项目中创建一个OC文件的时候,Xcode 会提示创建一个桥接文件 点确定创建桥接文件,Xcode会自动创建一个桥接文件

    名字:工程名-Bridging-Header.h

      把swift需要用到的OC文件的头文件放到桥接文件里 工程名-Bridging-Header.h

    例如:

    1、

    这个就是一个OC文件
    //#import "sec.h"
    #import <UIKit/UIKit.h>
    @interface sec : UIViewController
    -(void)actionMake;
    @end
     

    2、

    在桥接文件中把需要用到OC的头文件导入进去
    #import "sec.h"
     

    3、

    编译一下,就可以在swift中用swift的语法调用OC文件的方法了
    let second = sec()
    second.actionMake()

     

    三、注意和总结

    注意:

    1、OC项目在导入swift文件前 先按照系统提示创建桥接文件,
    2、在 targets -> Build Settings -> Packaging  中设置Defines Module 为YES
    3、在OC中调用swift文件的时候,swift中的类 要继承NSObject
    不然没办法在OC中调用
    4、OC中调用swift文件需要导入”工程名 -Swift.h"
         (这个是build Setting -> Packaging->Product Module Name 的名字,而这个属性默认是工程的名字)
    5、写完记得command + B 编译 一下
    6、swift项目 引用OC文件也需要创建 桥接文件,在这个桥接文件中导入OC文件的头文件
    7、桥接文件只有一个,作用只是为了 swift 引用OC文件,OC引用swift 文件虽然也需要创建桥接文件
            但是不需要在桥接文件中 导入swift文件
    8、如果一个项目既有OC引用swift 也有swift引用OC ,就先设置OC调用swift文件
         在桥接文件 导入OC文件,OC可以定义PCH文件导入”工程名 -Swift.h" 

     

     

    四、自定义桥接文件 

     

    如果不用Xcode提示创建桥接文件也可以自定义一个桥接文件

     

    1     使用 Header File  把里面的内容清空。

     

    2、 这文件名可以自定义, 一般还是用 工程名-Bridging-Header.h   例如app - file.h

     

    3    然后在 Build Setting -> Swift Compiler - Code Generation中

     

    4、设置Objective-C Bridging Header 为自定义的桥接文件相对于工程的绝对路径,也就是项目总文件夹的路径,如果在第一层,就直接写自定义的桥接文件的名file.h,如果在下一层,文件夹/桥接文件 app/file.h 
    展开全文
  • 该项目主要介绍了ocswift之间、swift内部几种常见的传值方式(属性传值、代码块传值、代理传值、通知) 如果ocswift之间的桥接有疑问请参考:OCswift桥接互调 项目介绍 1、swift之间的页面跳转与返回...

    该项目主要介绍了oc与swift之间、swift内部几种常见的传值方式(属性传值、代码块传值、代理传值、通知)

    如果oc与swift之间的桥接有疑问请参考:OC与swift桥接互调

    项目介绍

    • 1、swift之间的页面跳转与返回
    • 2、oc监听swift推送的通知
    • 3、swift内部推送接收的通知
    • 4、oc调用swift的代理方法
    • 5、swift调用oc代码块
    • 6、oc对swift的属性传值、方法调用、代码块调用
    • 7、swift对oc的属性传值、方法调用、代码块调用
    • 8、swift之间的传值

    1、swift之间的页面跳转与返回

    1、present方式跳转

     @objc func btnAction(_ sender:UIButton){
            let subVC  = SubVC();
            self.present(subVC, animated: true) {
                NSLog("������:%@", subVC);
            };
            NSLog("������:%@____%@",sender,self);
        }

    2、返回

    self.dismiss(animated: true) {
                    NSLog("返回");
                };

    2、oc监听swift推送的通知:

    • swift发送通知
     func postNotifition(){
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "XMNotification"), object: "通知方法");
        }
    • oc接收通知
    -(void)addNotification{
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiAction:) name:@"XMNotification" object:nil];
    }
    
    -(void)notiAction:(NSNotification *)sender{
        NSLog(@"oc:%@",sender.object);
    }
    
    -(void)removeNotification{
        [[NSNotificationCenter defaultCenter] removeObserver:self name:@"XMNotification" object:nil];
    }
    

    3、swift内部推送接收的通知:

     func postNotifition(){
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "XMNotification"), object: "通知方法");
        }
    
        @objc func addNotification(){
            NotificationCenter.default.addObserver(self, selector: #selector(notificationAction(_:)), name: NSNotification.Name(rawValue: "XMNotification"), object: nil);
        }
        @objc func removeNotifition() {
            NotificationCenter.default.removeObserver(self);
        }
    
        @objc private func notificationAction(_ noti : Notification){
            let str:String = noti.object as! String;
            print("swift:" + str);
        }

    通知打印结果

    4、oc调用swift的代理方法:

    • 编辑协议方
    ///1、编辑协议
    @objc(FourVCDelegate)
    protocol FourVCDelegate {
        func backSuperVC(str:String)
    }
    
    ///2、定义协议对象
    @objc var myDelegate:FourVCDelegate?;
    
    ///3、调用协议
    let str:String = "代理方法"
    self.myDelegate?.backSuperVC(str: str);
    • 签署协议方
    ///1、调用协议
    @interface FirVC ()<FourVCDelegate>
    
    ///2、签署协议
    -(SecVC *)seVc{
        if (!_seVc) {
            _seVc = [SecVC new];
            _seVc.myDelegate = self;
        }
        return _seVc;
    }
    
    ///3、协议实现
    -(void)backSuperVCWithStr:(NSString *)str{
        NSLog(@"%@", str);
    }
    

    代理协议打印结果

    5、swift调用oc代码块

    • oc文件类
    ///代码块定义
    @property(nonatomic,strong)void (^thiBlock)(NSString *str);
    
    ///代码块实现
    !self.thiBlock?:self.thiBlock(@"swift调用oc代码块");
    • swift文件类
    
    let vc  = ThiVC();
    ///代码块调用
    vc.thiBlock = {(str) -> () in
        print("代码块方法");
    }
    
    self.present(vc, animated: true, completion: {
    
    });

    提示

    6、oc对swift的属性传值、方法调用、代码块调用

    • swift方法类
    import UIKit
    
    class FourVC: UIViewController {
    
        ///数组
        @objc var arr0:NSArray = NSArray()
    
        ///无参数无返回值
        @objc func swMethod0(){
            print("无参数无返回值");
        }
        ///有参数无返回值
        @objc func swMethod1(str: String)  {
            print("有参数无返回值:\(str)");
        }
        ///有参数有返回值
        @objc func swMethod2(str: String) -> (String){
            return "有参数有返回值:" + str;
        }
    
        /// mark - 代码块
        ///无返回参数
        @objc func bkBlock0(response:() -> ()){
            response();
        }
        ///返回一个字符串参数
        @objc func bkBlock1(response:(_ res : String) -> ()) {
            response("返回一个字符串参数");
        }
        ///返回多个任意类型参数
        @objc func bkBlock_2_(response:(_ res : Any,_ res1 : Any) -> ()) {
            response(self.arr0, "无参数,返回多个任意类型参数:");
        }
        ///传入多个参数 并返回多个任意类型的参数
        @objc func bkBlock3(p1:Any,p2:Any,p3:Any,res:(_ res0 : Any ,_ res1 : Any ,_ res2:Any,_ res3:Any) -> ()) {
            res("传入多个参数 并返回多个任意类型的参数:\n",p1, p2, p3);
        }
        ///Block带返回值
        @objc func bkBlock4(res:() -> ()) -> (String){
            res();
            return "Block带返回值"
        }
    
    
        //定义block
        typealias fucBlock = (_ backMsg : String?) ->()
        func bkBlock4(cmdStr:String?,blockProperty:fucBlock){
            blockProperty("backMsg---by block inside func")
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.view.backgroundColor = UIColor.yellow;
            print("属性传值结果:",self.arr0[0],self.arr0[1],arr0[2]);
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            self.dismiss(animated: true) {
    
            };
        }
    }
    
    • oc方法类:
        FourVC *vc = [FourVC new];
        // --- 属性传值 ---
        vc.arr0 = @[@"可以",@"可以",@"可以"];
    
        /// ------ 方法调用 -----
    
        //无参数无返回值
        [vc swMethod0];
        //有参数无返回值
        [vc swMethod1WithStr:@"dasda"];
        //有参数有返回值
        NSString *str = [vc swMethod2WithStr:@"sdfasda"];
        NSLog(@"%@",str);
    
        /// ------ 代码块调用 -----
    
        [vc bkBlock0WithResponse:^{
            NSLog(@"无返回数据代码块");
        }];
    
        //有一个返回值
        [vc bkBlock1WithResponse:^(NSString * str) {
            NSLog(@"%@", str);
        }];
    
        //有两个返回值
        [vc bkBlock_2_WithResponse:^(id str, id str1) {
            NSLog(@"%@\n%@",str1,str);
        }];
    
        //有参数有返回值
        [vc bkBlock3WithP1:@"ds" p2:@"dsa" p3:@"das" res:^(id p0,id p1, id p2, id p3) {
            NSLog(@"%@\n%@\n%@\n%@",p0,p1,p2,p3);
        }];
    
        [self presentViewController:vc animated:YES completion:^{
    
        }];
    

    此处输入图片的描述

    7、swift对oc的属性传值、方法调用、代码块调用

    • xxx.h文件
    @interface OcVC : UIViewController
    ///代码块
    @property(nonatomic,strong)void (^clickBlock)(void);
    ///字符串
    @property(nonatomic,copy)NSString *titStr;
    ///方法
    -(void)testAction;
    @end
    
    • xxx.m文件
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSLog(@"%@",self.titStr);
        !self.clickBlock?:self.clickBlock();
    }
    
    -(void)testAction{
        NSLog(@"调用方法");
    }
    
      xxx.swift文件
    
    let sub  = OcVC();
    //属性传值
    sub.titStr = "属性传值";
    //方法调用
    sub.testAction();
    
    //代码块调用
    sub.clickBlock = { () -> () in
         print("不带参数代码块")
    };
    
    sub.clickBlock();
    self.present(sub, animated: true, completion: {
    
    });

    打印结果

    8、swift之间的传值

        func jumpToNextVC(){
            ///mark - =============
            let foVC =  FourVC()
    
            let dic:NSDictionary = ["key":1,"key1":2];
            let arr0:NSMutableArray = ["你好","好不好"];
    
            // mark -  属性传值
            foVC.arr0 = arr0;
    
            //方法调用
            foVC.swMethod0();
            foVC.swMethod1(str: "da");
            let str = foVC.swMethod2(str: "ddd");
            print(str);
    
            // mark -  代码块回调
            foVC.bkBlock0 {
                print("你可以的");
            };
            foVC.bkBlock1 { (res) in
                print(res);
            }
            foVC.bkBlock_2_{ (res, str) in
                print(res, "+", str);
            }
            foVC.bkBlock3(p1: "1", p2: "2", p3: "3") { (res0, res1, res2, res3) in
                print(res0,res1,res2,res3);
            }
            self.present(foVC, animated: true) {
    
            };
        }

    原文地址:https://blog.csdn.net/weixin_38633659/article/details/81569207

    展开全文
  • IOS --- OCSwift混编

    2017-05-16 18:08:38
    先中简单的入手,先研究在同一个工程目录下混合使用的情况。...[cpp] view plaincopy--- OCSwift混编" TITLE="IOS --- OCSwift混编" />--- OCSwift混编" TITLE="IOS --- OCSwift混编" /> impor


    先中简单的入手,先研究在同一个工程目录下混合使用的情况。

    为了演示。先准备两个类

    第一个是swift语言写的类,文件名为 act.swift

     

    import Foundation  
      
    class Act : NSObject  
    {  
        func hasAct(tag:Int) -> String  
        {  
            switch (tag)  
            {  
            case 1:return "Movie"  
            case 2:return "CCTV"  
            case 3:return "Sport TV"  
            default:return "Area TV"  
            }  
        }  
          
        init()  
        {  
            println("act constructor is called.")  
        }  
          
        deinit  
        {  
            println("act destroyed is called.")  
        }  
    }  

     

    第二个是用OC写的类 头文件为OCChannel.h ,实现文件为OCChannel.m

    头文件

     

    #import   
      
    @interface OCChannel : NSObject  
      
    @property (nonatomic,retain) NSString *ChannelName;  
      
    - (NSString *)ChannelChange:(NSInteger) channels;  
      
    @end  

    实现文件
     

     

    #import "OCChannel.h"  
    #import "SwiftModule-swift.h"  
      
    @interface OCChannel()  
    {  
        Act     *act;  //swift的类  
    }  
    @end  
      
    @implementation OCChannel  
      
    - (id)init  
    {  
        if (self = [super init]) {  
            NSLog(@"OC Constructor is called.");  
            //使用Swift类  
            act = [[Act alloc]init];  
        }  
        return self;  
    }  
      
    - (void)dealloc  
    {  
        NSLog(@"OC Destroyed is called.");  
        //[act release];//ARC not use  
        //[super dealloc];//ARC not use  
    }  
      
    - (NSString *)ChannelChange:(NSInteger) channels  
    {  
        return [act hasAct:channels];  
    }  
      
    @end  

    这个OCChannel为中引用了swift 写的类Act 。主要是为了演示在同一个工程项目里,swift类调用OC,同时OC类也调用Swift。从而形成一种混合编写的模式。
     



    下面是具体步骤:

    1.新建一个Swift工程:我这里工程名为MixDemo
    IOS <wbr>--- <wbr>OC与Swift混编


    建好后工程:
    IOS <wbr>--- <wbr>OC与Swift混编


    2.就是分别引入前面的两个类,咱先一个个来。因为建的是Swift,所以,咱先以Swift工程中引用OC文件进行一次混编

    Swift中使用OC

    首先Swift中不再使用头文件和.m文件的方式了。所以也不需要使用import ""来导入头文件。哪swift 如何能访问到OC的类声明的。

    其实,swift也是需要使用头文件进行访问的,只不过不再需要使用显式的方式使用import进行导入。有两种方式来实现这个头文件的生成。

    方式一:在一个全新的Swift,利用第一次新建提示的方式自动添加桥接头文件。

    IOS <wbr>--- <wbr>OC与Swift混编
    IOS <wbr>--- <wbr>OC与Swift混编
    IOS <wbr>--- <wbr>OC与Swift混编



    点确定这后就会生成一个以的头文件。

    建好后的工程:
    IOS <wbr>--- <wbr>OC与Swift混编


    这里有一个地方需要注意的就是在targets->build settings ->Object-C Bridging Header 设为哪个桥接的头文件即可。

    IOS <wbr>--- <wbr>OC与Swift混编



    经过上述步骤,桥接文件弄好了就可以

    尽情的把想要在swift类中调用的OC头文件放使用import "" 写到这个桥接文件中吧。就像:

     

    //  
    //  Use this file to import your target's public headers that you would like to expose to Swift.  
    //MixDemo/MixDemo-Bridging-Header.h  
      
    #import "OCChannel.h"  

    同样的,当你知道这个swift搜索头文件的关系后,就不需要再理会这个-Bridging-Header.h的文件了。完全可以手工建一个并取自己喜欢的名字。如:
     

    方式二:

    新建一个头文件,名为:OCContainerHeader.h
    IOS <wbr>--- <wbr>OC与Swift混编
    IOS <wbr>--- <wbr>OC与Swift混编


    好了,以上的设置后就完全满足了Swift使用OC写的类了。

     

    import UIKit  
      
    class ViewController: UIViewController {  
                                  
        override func viewDidLoad() {  
            super.viewDidLoad()  
            // Do any additional setup after loading the view, typically from a nib.  
      
            //调用OC类  
            var channel = OCChannel()  
            println(channel.ChannelChange(10))  
            println(channel.ChannelChange(2))  
        }  
      
        override func didReceiveMemoryWarning() {  
            super.didReceiveMemoryWarning()  
            // Dispose of any resources that can be recreated.  
        }  
      
      
    }  

    好了下面再来看一下OC如何调用Swift写的类。(事实上,如果你是一比一抄我这个DEMO,哪么恭喜你,在以上你将编译不通过。因为我的OC类中引用了swfit 写的类,所以你要想运行,就必须把哪个Act 的类注释了才行。)
     



    OC如何调用Swift写的类

    OC要想使用,必须有头文件。而swift文件却没有头文件,所在咱们想必也需要产生一个头文件。但对于OC调用swift  的头文件比较特殊。因头文件里面的机制是自动生成的,在不熟悉的,不建议手写。

    哪如何产生这个头文件。(注意,系统设置的头文件,在工程中是看不到的。)

    产生步骤:

    选中targets->build settings ->packing->Product Module Name 中设置模块名,这个名称很重要 swift 的头文件就是根据这个来命名的。
    IOS <wbr>--- <wbr>OC与Swift混编

    IOS <wbr>--- <wbr>OC与Swift混编


    虽然你看图中有这个import "SwiftModule-swift.h"但你在整个工程中是找不到这个文件的,但可以使用CMD+ 鼠标点击可看这个头文件中的内容。
    IOS <wbr>--- <wbr>OC与Swift混编




    这样,工程中如查Swift要使用OC,则把需要使用的OC类的头文件,全写在MixDemo-Bridging-Header.h里。同样如果OC中所使用的swift类,只需要Clean一把,再编就可以了,但不要忘了导入SwiftModule-swift.h哦(名称自取,但-swift.h是固定的),另外还有一个需要读者注意的。

    注:

    凡是用Swift写的类,如果不继成自NSObject或NSObject 的派生类,哪么编译后将不会生成对应的转换类。从而使得OC 中找不到相应的声明。

    如我的例子中 class Act 这样不会被编译到SwiftModule-swift.h中,但写为 class Act : NSObject,就可以编译出相应的声明。另外可以使用@objc加以声明,但这个还是一样,类最好继承NSObject下来。就像下面:

     

     

    import Foundation  
      
    @objc(Act)  
      
    class Act   
    {  
        func hasAct(tag:Int) -> String  
        {  
            switch (tag)  
            {  
            case 1:return "Movie"  
            case 2:return "CCTV"  
            case 3:return "Sport TV"  
            default:return "Area TV"  
            }  
        }  
      
        @objc(init)//原本以为加上这个alloc就可以找到,但不行的。。。  
        init()  
        {  
            println("act constructor is called.")  
        }  
          
        deinit  
        {  
            println("act destroyed is called.")  
        }  
    }  

    但是在使用时你就会发现
     


            act = [[Act alloc]init]; //报错,找不到alloc,因此建议大家还是继承NSObject.
    展开全文
  • 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 ...
  • iOS oc 调用 swift

    2019-07-03 07:14:24
    如股票oc要调用swift里面的代码 需要包含固定这个头文件 项目名称 LiqunSwiftDemo-Swift.h #ProjectName#-Swift.h 固定的写法 swift 目的 是取代oc 但是 不会完全取代 只是前端的替换 LiqunSwiftDemo-Swift 点...
  • OCswift混编

    2019-02-20 00:38:40
    相信很多iOS开发或多或少已经使用过swift,由于维护的项目时间比较久了,以往都是使用OC开发,现在正在对已有一些功能进行改版重写,索性使用swift来做,以下是在使用OCswift进行混编过程的一些介绍。一、工程配置...
  • 上篇讲了Swift中使用OCSwift中使用OC,这篇讲下OC中使用Swift类。 在OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。 特别注意 1、被使用的Swift的类必须是至少继承自NSObject...
  • WWDC推出了SwiftUI、Combine,仅Swift可用~为了能顺利的也吃上SwiftUI,我也打算将自己的项目先从OC慢慢迁移到Swift,所以~一起从混编开始! 创建Swift的view 正常创建文件,语言选swift 创建Bridging Header 上...
  • OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(与你的项目配置相关,具体配置方式见上一篇文章) 2.OC类里仅可以调用public的Swift...
  • OCSwift 区别

    2019-09-26 15:34:11
    OCSwift 区别 一、block = 闭包 OC——block typedef void(^successBlock)(NSURL* url,id data); swift——闭包 typealias successBlock = (NSURL, AnyObject) -> Void; @escaping 逃逸闭包 :闭包...
  • OCSwift混编

    2016-01-26 10:16:30
    Swift发展势头越来越好,而很多公司很难一下子从OC全部切换到swift,这个时候混编就显得那么的重要,本人也在逐渐的尝试混编然后逐步取代OC,从而全部转到swift上。 其实,从2014年swift刚出来的时候就开始研究swift...
  • OCSwift中的字符串

    2019-02-20 00:37:46
    一、OC中的字符串 引用类型在Object-C中,使用NSString和NSMutableString这两个类对字符串进行操作,一个字符串对象会被指针所引用。一般情况下,使用一个旧的字符串对象对一个新声明的字符串对象进行赋值,其实就是...
  • OCSwift - 目录

    2019-09-20 09:33:36
    OCSwift(3)- String和NSString 从OCSwift(4)- 协议 从OCSwift(5)- 动态性,KVC\KVO -## 从OCSwift(6)- 关联对象 从OCSwift(7)- 资源名管理 从OCSwift(8)- 多线...
  • OCSwift指南

    2020-03-10 00:01:09
    作者丨zhangferry来源丨iOS成长之路运行环境:Xcode 11.1 Swift5.0最近参与的一个项目需要从Objective-C(以下简称OC)转到Swift,期间遇到了一些...
  • 随着Swift的日益完善,终究会取代OC的地位,就像Kotlin取代Java一样,不是时间的问题,而是使用者愿意不愿意被时代淘汰的问题首先是Swift中定义闭包
  • 接上篇文章:iOS 快速从OC过渡到Swift,由理论到实战-Swift基础 OCSwift混编 a. SwiftOC 的映射关系 Swift 兼容来大部分 OC,当然还有一些 Swift 不能够使用的,例如 OC 中的预处理指令,即宏定义不可...
1 2 3 4 5 ... 20
收藏数 7,689
精华内容 3,075
关键字:

oc string swift