oc在线转换 swift

2016-12-29 14:28:22 yishengzhiai005 阅读数 2952

目录(?)[+]

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

2015-09-16 20:30:25 ltt_young 阅读数 5102
1、获取对象类型
OC:

NSDate* date = [NSDatedate];

NSLog(@"%@",NSStringFromClass([date class]));


Swift

letdate =NSDate()

letname = date.dynamicType


共有:

let name:AnyClass! = object_getClass(date)


2、函数入参中对象转化
OC转Swift,对象变为可选类型
Swift转OC,不用改变

3、枚举
1)Swift按位操作使用OptionSetType
struct MyOptions : OptionSetType {
    let rawValue: Int

    static let None         = MyOptions(rawValue: 0)
    static let FirstOption  = MyOptions(rawValue: 1 << 0)
    static let SecondOption = MyOptions(rawValue: 1 << 1)
    static let ThirdOption  = MyOptions(rawValue: 1 << 2)
}

Now we can use set-based semantics with MyOptions:

let singleOption = MyOptions.FirstOption
let multipleOptions: MyOptions = [.FirstOption, .SecondOption]
if multipleOptions.contains(.SecondOption) {
   
print("multipleOptions has SecondOption")
}
let allOptions = MyOptions(rawValue: 7)
if allOptions.contains(.ThirdOption) {
   
print("allOptions has ThirdOption")
}

2)OC调用Swift,只需增加前缀@objc
@objc enum Bear: Int {
    case Black, Grizzly, Polar
}

Shamelessly taken from the Swift Blog


In Objective-C this would look like

Bear type = BearBlack;
switch (type) {
   
case BearBlack:
   
case BearGrizzly:
   
case BearPolar:
       
[self runLikeHell];
}

3)Swift调用OC直接使用rawValue
2016-07-31 08:56:30 huangyongf 阅读数 2359

OC枚举和Swift 枚举


下面介绍一下 OC 枚举和 Swift 枚举的写法!

OC枚举:


         


Swift 枚举:

            


 以上,希望对大家会有所帮助,谢谢!










2017-04-12 14:35:21 cordova 阅读数 1459

OC和Swift之间的互调很简单,iOS8以后官方给出了这两种语言之间的桥接方案,简单说就是在Swift工程中,通过提示创建的Bridging头文件可以将OC文件和Swift文件衔接在一起,从而可以在OC文件中引用Swift类,或者在Swift文件中引用OC的类。应用较多的主要是在Swift中调用OC类,使得在最新的swift工程中仍然能够兼容使用以前的OC类库等。

这里通过一个简单的例子展示在Swift工程中OC和Swift之间的互调:

首先建立一个Swift工程,这里创建了一个Single View Application,工程名为SwiftBridge,并分别新建了一个新的名为SwiftClass的swift类文件和一个名为OCClass的OC类文件,创建第一个OC文件后会提示创建一个Bridging头文件,创建后就可以对两者进行桥接:

这里我们在ViewController.swift中调用OCClass类,同时在OCClass类中调用SwiftClass.swift。其中在swift中引用OC类时要在Bridging头文件中引入OC类的头文件(swift文件中没有头文件及其引用),而在OC中引用swift类时直接引入“SwiftBridge-swift.h”即可,不需要在Bridging头文件设置,其中“SwiftBridge”为工程名,该文件是隐藏的,对工程中所有swift类文件进行了向OC语言的翻译,从而在OC文件中可以像调用其他OC文件一样调用工程中的swift类文件。

  1. 在SwiftClass.swift中定义一个实例方法和一个类方法:
import UIKit

class SwiftClass: NSObject {
    func SwiftInstanceMethod() -> Void {
        print("swift instance method!");
    }
    class func SwiftClassMethod() -> Void {
        print("swift class method!");
    }
}
  1. 在OCClass类中调用SwiftClass:
/* OCClass.h */
#import <Foundation/Foundation.h>

@interface OCClass : NSObject
- (void)OCInstanceMethod;
+ (void)OCClassMethod;
@end

/* OCClass.m */
#import "OCClass.h"
#import "SwiftBridge-swift.h" /* 引入swift类头文件 */

@implementation OCClass
- (void)OCInstanceMethod {
    /* 调用swift实例方法 */
    SwiftClass *swiftc = [[SwiftClass alloc] init];
    [swiftc SwiftInstanceMethod];
    NSLog(@"oc instance method!");
}
+ (void)OCClassMethod {
    /* 调用swift类方法 */
    [SwiftClass SwiftClassMethod];
    NSLog(@"oc class method!");
}
@end
  1. 在Bridging头文件引入OC类头文件供swift调用:
/* SwiftBridge-swift.h */
#import "OCClass.h"
  1. 在ViewController.swift中调用OCClass类:
/* ViewController.swift */
import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let occ = OCClass()
        occ.ocInstanceMethod()
        OCClass.ocClassMethod()
    }
}

打印结果:

swift instance method!
2017-04-12 12:40:39.657 SwiftBridge[3773:5420107] oc instance method!
swift class method!
2017-04-12 12:40:39.657 SwiftBridge[3773:5420107] oc class method!

另外类似的也可以实现swift和C语言之间的互调。

2015-10-07 11:36:00 weixin_30767921 阅读数 137

1.

Objectice-C code:

 1 NSShadow *shadow = [NSShadow new];
 2 
 3 [shadow setShadowColor:[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0]];
 4 
 5 [shadow setShadowOffset:CGSizeMake(0, 1)];
 6 
 7 NSDictionary *attributes = @{
 8 
 9                                 NSForegroundColorAttributeName: [UIColor colorWithRed:220.0/255.0 green:104.0/255.0 blue:1.0/255.0 alpha:1.0],
10 
11                                 NSShadowAttributeName: shadow,
12 
13                                 NSFontAttributeName: [UIFont fontWithName:@"AmericanTypewriter" size:16.0]
14 
15                              };
16 
17 [self.navigationItem.rightBarButtonItem setTitleTextAttributes:attributes forState: UIControlStateNormal];
18 
19 // Or you can use.
20 
21 [[UIBarItem appearance] setTitleTextAttributes:attributes forState: UIControlStateNormal];

Swift Code:

// Bar title text color

let shadow = NSShadow()

shadow.shadowColor = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

shadow.shadowOffset = CGSizeMake(0, 1)

let color : UIColor = UIColor(red: 220.0/255.0, green: 104.0/255.0, blue: 1.0/255.0, alpha: 1.0)

let titleFont : UIFont = UIFont(name: "AmericanTypewriter", size: 16.0)!

let attributes = [

                        NSForegroundColorAttributeName : color,

                        NSShadowAttributeName : shadow,

                        NSFontAttributeName : titleFont

                 ]

self.navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, forState: UIControlState.Normal)

// Or you can use

UIBarItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)

 2.

OC:

    //设置导航栏字体颜色

    [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor],UITextAttributeTextColor,nil]];

    //[UIFont fontWithName:@"Arial-Bold" size:0.0], UITextAttributeFont

Swift:

UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor(),

        NSFontAttributeName: UIFont(name: "Heiti SC", size: 24.0)!]

3.

OC: 

//改变UITabBarItem字体颜色

    [[UITabBarItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:0 green:0.72 blue:0.69 alpha:1],UITextAttributeTextColor, nil] forState:UIControlStateSelected];

Swift:

let attributes =  [NSForegroundColorAttributeName: UIColor(red: 0, green: 0.72, blue: 0.69, alpha: 1)]

        UITabBarItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Selected)

4.

OC:

//警示样式

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"标题" message:@"这是个UIAlertController的默认样式" preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:nil];

    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:nil];

    [alertController addAction:cancelAction];

    [alertController addAction:okAction];

    [self presentViewController:alertController animated:YES completion:nil];

Swift:

//警示样式

        let alertController = UIAlertController(title: "标题", message:"这个是UIAlertController的默认样式", preferredStyle: UIAlertControllerStyle.Alert)

        let cancelAction = UIAlertAction(title: "取消", style:UIAlertActionStyle.Destructive, handler: nil)

        let okAction = UIAlertAction(title: "确定", style:UIAlertActionStyle.Default, handler:nil)

        alertController.addAction(cancelAction)

        alertController.addAction(okAction)

        self.presentViewController(alertController,animated:true,completion:nil)

 

转载于:https://www.cnblogs.com/abelsu/p/4858443.html

iOS oc 调用 swift

阅读数 533

OC转Swift工具

阅读数 2565

OC与swift区别

阅读数 794