• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Objective-C和Swift混合编程开发

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

创建混编的Framework工程

  • 新建项目: 
  • 选择模板: 
  • 配置项目名称和语言 
  • // // OCView.h // FirstMixed // // Created by WuQiong on 6/3/14. // Copyright (c) 2014 长沙戴维营教育. All rights reserved. // #import <UIKit/UIKit.h> @interface OCView : UIView @end

    OCView.m内容如下:

    //
    //  OCView.m
    //  FirstMixed
    //
    //  Created by WuQiong on 6/3/14.
    //  Copyright (c) 2014 长沙戴维营教育. All rights reserved.
    //
    
    #import "OCView.h"
    
    //引入swift代码自动生成的接口文件,此文件会自动生成的。不要自己创建。
    //此文件路径的命名格式为<ProjectName/ProductModuleName-Swift.h>,-Swift.h是固定后缀
    #import <FirstMixed/FirstMixed-Swift.h>
    
    @implementation OCView
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            OCView *mView = [[OCView alloc] initWithFrame: CGRectMake(0, 0, frame.size.width/2, frame.size.height)];
            [self addSubview: mView];
            //在OC代码里使用Swift代码写的类
            SwiftView *swiftView = [[SwiftView alloc]initWithFrame:CGRectMake(20,10, 20, 20)];
            [self addSubview:swiftView];
        }
        return self;
    }
    
    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
        // Drawing code
    }
    */
    
    @end
    

    SwiftView.swift内容如下:

    //
    //  SwiftView.swift
    //  FirstMixed
    //
    //  Created by WuQiong on 6/4/14.
    //  Copyright (c) 2014 长沙戴维营教育. All rights reserved.
    //
    
    import UIKit
    
    class SwiftView: UIView {
    
        init(frame: CGRect) {
            super.init(frame: frame)
        }
    
        /*
        // Only override drawRect: if you perform custom drawing.
        // An empty implementation adversely affects performance during animation.
        override func drawRect(rect: CGRect)
        {
            // Drawing code
        }
        */
    
    }
    

    MixedSwift.swift内容如下:

    //
    //  MixedView.swift
    //  FirstMixed
    //
    //  Created by WuQiong on 6/3/14.
    //  Copyright (c) 2014 长沙戴维营教育. All rights reserved.
    //
    
    import UIKit
    
    class MixedView: UIView {
    
        init(frame: CGRect) {
            super.init(frame: frame)
    
            self.backgroundColor = UIColor.purpleColor()
    
            //在swift代码里使用OC写的类。
            //需要在build setting里的Objective-C Bridge Headers
            //里设置所需要用的OC类接口文件的路径,而非目录路径。
            let ocView = OCView();
            self.addSubview(ocView);
        }
    
        /*
        // Only override drawRect: if you perform custom drawing.
        // An empty implementation adversely affects performance during animation.
        override func drawRect(rect: CGRect)
        {
            // Drawing code
        }
        */
    
    }
    

    如果只是在本项目中的Swift代码中调用指定的Objective-C代码,那只需要在工程设置页面的Build Settings中的Objective-C Bridge Headers里设置所需要用的指定OC接口文件的路径,而非目录路径。这样就可以在Swift文件里可见病使用了。 完全不需要在Swift代码里进行任何类似import这样的行为操作。

    Objective-C Bridge Headers设置图示:

    以上是我们自定义实现的一些代码,下面我们来看看Xcode自动生成的那个接口文件是什么样的: FirstFixed.h的内容:

    //
    //  FirstMixed.h
    //  FirstMixed
    //
    //  Created by WuQiong on 6/3/14.
    //  Copyright (c) 2014 长沙戴维营教育. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    //! Project version number for FirstMixed.
    FOUNDATION_EXPORT double FirstMixedVersionNumber;
    
    //! Project version string for FirstMixed.
    FOUNDATION_EXPORT const unsigned char FirstMixedVersionString[];
    
    // In this header, you should import all the public headers of your framework using statements like #import <FirstMixed/PublicHeader.h>
    

    大家注意一下Xcode6-Beta自动生成的接口文件的最后一行注释,表达出了一个我们之前没遇到过的概念。那就是接口文件他也划分了public、private、project三个范畴的概念。这个大家可以去工程设置里的Build Phases里可以看到新版Xcode的变化。

    到目前为止,我们的firstMixed.Framework项目就有空成功编译了。 但是现在的framework如果被引入到其他App项目去使用的话。那就只能使用里面的那2个Swift类,而不能使用OCView这个类。因为默认只导出了Swift代码写的类到这个框架的接口文件中,这个大家可以打开framework下对应的Headers目录查看个究竟。

    好,如果我们需要把这个混合语言编写的framework中的Objective-C代码的接口文件也需要导出到此框架的接口文件中,即公开出去。这个时候我们需要做两个操作:

    1. 在工程设置页面的Build Phases里,把Headers中的Project栏目下的OCView.h这个Objective-C写的接口文件拖拉到上面的Public栏目下,这样就会把Objective-C写的类和函数的接口给公开给框架的使用者。
    2. 在Xcode6-Beta自动生成的FirstMixed.h接口文件的最后加入一行导入所要公开的接口文件:
    //
    //  FirstMixed.h
    //  FirstMixed
    //
    //  Created by WuQiong on 6/3/14.
    //  Copyright (c) 2014 长沙戴维营教育. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    
    //! Project version number for FirstMixed.
    FOUNDATION_EXPORT double FirstMixedVersionNumber;
    
    //! Project version string for FirstMixed.
    FOUNDATION_EXPORT const unsigned char FirstMixedVersionString[];
    
    // In this header, you should import all the public headers of your framework using statements like #import <FirstMixed/PublicHeader.h>
    #import <FirstMixed/FirstMixed.h> //本接口文件必须在项目的Build Phases页面中的Headers栏里面设置为public,否则编译出错。
    

    其实,有经验的同学应该会意识到,上面第二条可以不在最后加这接口文件,这里加到框架的接口文件后面是为了统一接口。简单化。

    这样,把工程编译完后,就会生成一个FirstMixed.framwork。把他加入到其他App工程中后。就可以只有的使用framework中的Objective-C和Swift的公开的所有类和函数了,不管是Objective-C还是Swift的,都可以。

    该文章已有0人参与评论

    请发表评论

    全部评论

    专题导读
    上一篇:
    swift学习1发布时间:2022-07-13
    下一篇:
    Swift—Cocoa Touch设计模式-备 -发布时间:2022-07-13
    热门推荐
    热门话题
    阅读排行榜

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap