• Swift和Objective-C混编注意事项


    转载:

    http://www.cnblogs.com/linfenren/p/5985202.html

    混编的情况为两种:

    在OC中调用Swift文件:在OC文件中引入#import"ProjectName-swift.h"(工程名-swift) ,该文件为隐含文件

    在Swift调用OC/C:只需要在桥接头文件projectName-Bridging-Header.h引入需要的头文件,没有头文件的c类的方法,需要在头文件中声明

    桥接头文件,会在首次创建其他文件的时候自动生成也可手动添加但命名规则要符合标准

    混编注意事项

    对于需要混编的Swift类添加@objc声明或继承NSObject或NSObject的子类

    复制代码
    复制代码
     class TestClass {
    
    // 属性
    
    // 实现
    
    }
    复制代码
    复制代码

    如果要在Objective-C类中使用TestClass类,应当使用@objc加以声明,或者将TestClass继承自NSObject或NSObject的子类,否则,引入ProductName-Swift.h之后,程序找不到对应类。

    使用第三方Framework

    设置: target-->build setting -->Packaging -->Defines Module为 “Yes”;

    然后,配置文件Target -> Build Phases -> Link Binary,添加要导入的Framework;

    最后,还是要配置桥接文件,比如要使用 abc-lib.framework库中的 abc.h 就要这样配置:#import"abc-lib/abc.h";

    Subclass子类问题

    对于自定义的类而言,Objective-C的类,不能继承自Swift的类,即要混编的OC类不能是Swift类的子类。反过来,需要混编的Swift类可以继承自OC的类。 注解

    OC宏文件

    如Swift文件要使用OC中定义的宏,只能使用常量简单宏文件。

    Swift独有特性

    Swift中有许多OC没有的特性,比如,Swift有元组、为一等公民的函数、还有特有的枚举类型。所以,要使用的混编文件要注意Swift独有属性问题。

    案例之Swift中使用OC的block

    Swift中使用Closure不能使用Block作为属性进行传值,必须是初始化方法或函数。
    Objective-C文件中:

    复制代码
    复制代码
    #import <UIKit/UIKit.h>
    
    typedef void (^Myblock)(NSString *arg); 
    
    @interface FirViewController : UIViewController 
    //@property (copy, nonatomic) Myblock myBlock; 
    //这种作为公共参数的形式,如果在Swift类中去回调的话,是有问题的。提示没有初始化方法,所以使用下面的以Block为参数的方法 
    
    - (void)transValue:(Myblock) block;
    
    @end
    复制代码
    复制代码

    下面是.m文件

    复制代码
    复制代码
    #import "FirViewController.h" 
    @implementation FirViewController 
    
    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
        self.view.backgroundColor = [UIColor whiteColor]; 
    } 
    
    - (void)transValue:(Myblock)block
    { 
        if (block) 
        { 
            block(@"firBack"); 
        } 
    } 
    @end
    复制代码
    复制代码

    在Swift文件回调:

    在Swift使用OC的类时,首先在桥接文件中声明oc的头文件
    工程名-Bridging-Header.h这是创建Swift工程的情况下

    复制代码
    复制代码
    import UIKit 
    class ViewController: UIViewController 
    { 
       override func viewDidLoad() 
        { 
            super.viewDidLoad() 
            self.view.backgroundColor = UIColor.whiteColor() 
        } 
        @IBOutlet weak var goFirst: UIButton! 
        @IBAction func goFirstAction(sender: AnyObject) 
        { 
            let firVC:FirViewController = FirViewController() 
            firVC. transValue { ( arg:String !) -> Void in 
                self.aBtn?.setTitle(arg, forState: UIControlState.Normal)
            } 
            self.navigationController?.pushViewController(firVC, animated: true) 
    }
    复制代码
    复制代码
  • 相关阅读:
    搭建家庭无线Adhoc网络
    IPv4到IPv6的过渡技术
    IPV6的安全性
    IPv6技术简要解析
    安全删除和恢复文件的脚本
    什么是 WPS(WiFi Protected Setup)
    华为:IPv6过渡技术中的探索
    IPV6地址设置及使用方法
    部分IIS日志参数名称解释
    《隐秘的角落》
  • 原文地址:https://www.cnblogs.com/y16879w/p/6439318.html
Copyright © 2020-2023  润新知