• 一、概要 首先看《The Swift Programming Language》中提到“Swift’s compatibility with Objective-C lets you create a project that contains files written in either language. ”

    一、概要

    首先看《The Swift Programming Language》中提到“Swift’s compatibility with Objective-C lets you create a project that contains files written in either language. ”,意思是在一个项目中可以混合使用Swift和Objective-C,你可能有疑问了:

    1、如何让两种语言在一个项目中使用? 

    2、混编的项目是“Swift项目”还是“OC项目”?

    3、混编过程中,需要注意哪些细节?

    仅凭看文档可能会感觉没有头绪,所以还是实际动手试一试吧。


    二、混编

    1、OC项目中混编

    (1)首先创建一个项目,命名TestOC,语言选择Objective-C,不熟悉的可以参考这里

    (2)创建好项目后,在项目中添加一个新文件 New File -> Cocoa Class 语言选择Swift,命名为FileTest,选择Create的时候,会弹出如下页面:



    选择Yes,然后Xcode不仅创建了 FileTest.swift 文件,还创建了 TestOC-Bridging-Header.h 文件



    这个文件什么作用,看文档:



    向一个OC项目中添加Swift文件或者向一个Swift项目中添加OC文件,Xcode会自动生成ProName-Bridging-Header.h,作用就是告诉OC项目或Swift项目,这个Swift文件或者OC文件对外提供的内容,从命名“Bridging”也能大概猜到文件的用意。

    选择直接编译会报错,不要着急,修改刚创建的文件 FileTest.swift 中的代码:

    import Foundation
    
    @objc(FileTest)
    class FileTest: NSObject {
        @objc(initWithData:)
        init (data: String) {
            println(data)
        }
    }

    这里看到了 @objc()这种奇怪到写法,官网是这样描述的,意思是用@objc()想让一个Swift类被OC调用



     选择Swift文件中的类也定义好了,但发现在OC没办法调用,因为OC选择找不到 FileTest 类,这就需要配置一个参数:Build Setting -> Product Module Name,默认是没有配置的,Target -> Build Setting  ->Defines Module修改成Yes:



    选择在需要使用Swift文件类的地方引入头文件:#import "MyTest-Swift.h",然后在看效果:



    Swift中定义的类,可以在OC中使用了,MyTest-Swift.h 文件是什么?他是Xcode自动创建的,点击进去看看里边有什么:



    这样就几乎明白个七七八八了。


    现在可以实现OC中调用Swift了,那Swift中如何调用OC呢,直接修改Swift文件:



    发现这样不行,Swift文件没有找到ViewController这个OC的文件,这个时候桥接头文件就有用处了,修改 TestOC-Bridging-Header.h



    再次编译运行,发现没问题了。


    2、Swift项目中混编

    (1)首先创建一个项目,命名TestSwift,语言选择Swift,不熟悉的可以参考这里

    (2)创建好项目后,在项目中添加一个新文件 New File -> Cocoa Class 语言选择OC,命名为FileTest,点击Create后仍然会提示是否创建桥接文件,选择Yes:



    下面来说说Swift文件中调用OC:

    打开ViewController.swift,添加如下代码

    import UIKit
    
    class ViewController: UIViewController {
                                
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            
            var test = FileTest()
        }
        
        func customFun() {
        }
        
        func customFun1() {
        }
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }

    是不是报错啦?



    因为OC没有告诉Swift可以访问我哪些内容,很简单,在桥接文件中添加: #import"FileTest.h",告诉Swift,OC中FileTest可以访问:



    现在编译运行,没问题了吧!


    再来说说OC文件中调用Swift:

    在 FileTest.m 中添加代码:

    #import "FileTest.h"
    
    @implementation FileTest
    
    - (void) test {
        ViewController *viewCtr = [[ViewController alloc] init];
        NSLog(@"%@", viewCtr);
    }
    
    @end

    发现报错,找不到ViewController,没关系,缺少头文件,Target -> Build Setting  ->Product Module Name ,修改为MyTest,Target -> Build Setting  ->Defines Module修改成Yes。在FileTest.m中添加#import"MyTest-Swift.h",现在再编译运行,没问题了吧。

    #import "FileTest.h"
    #import "MyTest-Swift.h"
    
    @implementation FileTest
    
    - (void) test {
        ViewController *viewCtr = [[ViewController alloc] init];
        NSLog(@"%@", viewCtr);
    }
    
    @end



    点击进入Xcode生成的文件 MyTest-Swift.h ,所有可调用的Swift代码都在这里,包括我们自己写的方法:




    如果想使用第三方Framework怎么办?官方文档这么说的:



    其实也不难,打开项目配置文件Target -> Build Phases  -> Link Binary With Libraryer,添加你要导入的Framework,如果是第三方的库,可以选择Add Other(我这里选择的是第三方的Framework,也是我自己打包的库):



    这样目录结构中可以看到库了:



    使用很简单,首先还是要配置下桥接文件,比如我想使用 kalagame-library.framework库中的 KalaGameApi.h 就要这样配置:#import"kalagame-library/KalaGameApi.h"


    然后这样调用: var test1 = KalaGameApi(),现在基本的混编知识点就介绍完了。



    更多内容见官网文档

    由于对官网文档的理解可能不到位,可能对问题的理解有偏差,如果发现错误,还请指正,不胜感激。更多内容请点击这里

    Demo下载

    欢迎加入群共同学习和进步:QQ群:170549973


    展开全文
  • 说起这个话题,在我看来,比项目中的OC混编C++,C等简单些,毕竟OC和Swift都是苹果自己的开发语言,API什么的都一样,还是更容易混合开发些,好了,废话不多说,切正题,OCSwift怎么混和开发呢?OC类中可以引入...

    说起这个话题,在我看来,比项目中的OC混编C++,C等简单些,毕竟OC和Swift都是苹果自己的开发语言,API什么的都一样,还是更容易混合开发些,好了,废话不多说,切正题,OC与Swift怎么混和开发呢?OC类中可以引入Swift语言写的类,同样,Swift类中也可以引入OC语言写的类,这点首先我们得毋庸置疑!

    1.OC中引入Swift:

    1.创建一个OC的工程


    2.创建一个swift类


    3.点击next之后会出现下边这个


    4.点击创建这个桥,Xcode就会自动生成一个隐藏的文件,名字为“ProductName-Swift.h”;还有一个文件是一个桥接头文件,名字为“ProductName-Bridging-header.h”


    5.我们可以点开上边的“ProductName-Swift.h”,看看里边会有什么?


    6.我们会发觉里边全是用OC写的,已经把Swift语言成功得转化为了OC,好强大!!!所以就能用了啊,我们试着调用下看看:


    7.成功调起了Swift语言写的一个controller。

    2.Swift中引入OC:

    在Swift中引入OC,前边的创建类的过程我就不多赘述了,只看不一样的,刚我们在上边不是说有一个“ProductName-Bridging-Header.h”是不是还没用到,对的,现在就要用了,我们知道的,Swift是没有.h头文件的,但是OC是有头文件的,所以就有一个桥,看下图:


    对的,就是把Swift需要用的OC的类的头文件写到这个“ProductName-Bridging-Header.h”即可,就可调起来,我们试试看:


    come on,成功调起!!!

    就是这样了,自己跟着写一下就OK了


    Hope To Help You!

    展开全文
  • 概述 Swift的设计的初衷就是摆脱...随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以无缝结合。本文

    概述

    Swift的设计的初衷就是摆脱ObjC沉重的历史包袱,毕竟ObjC的历史太过悠久,相比于很多现代化语言它缺少一些很酷的语法特性,而且ObjC的语法和其他语言相比差别很大。随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以无缝结合。本文首先介绍下Swift与Objective-C混编的基本使用。

    Objc与Swift的渊源

    通过对swift的了解,大家不难发现Swift和ObjC必然存在着一定的映射关系,例如对于文件的操作使用了字符串的writeToFile方法,在网络请求时使用的NSURLSession,虽然调用方式不同但是其参数完全和做ObjC开发时调用方式一致。原因就是Swift编译器自动做了映射,如下图:(PS:借来的图)

    这里写图片描述

    Objc和Swift的相互调用

    切入正题,当我们使用OC和Swift在工程中进行混编的时候,通俗来说其实Objc文件和swift文件之间的相互调用。不管你的项目是基于Swift还是基于Objc的,无论是Swift中调用ObjC,还是ObjC中调用Swift都是通过头文件暴漏对应接口的,下图说明了这种交互方式:

    这里写图片描述


    • Swift调用Objc

    下面我们先建个Objc的工程,在Objc工程中新建Swift文件时,(或者在Swift工程新建Objc文件),Xcode会自动提示你是否创建bridging header桥接头文件,点击创建后Xcode会自动为你创建一个桥接头文件。Xcode会自动创建一个名为OC_Swift-Bridging-Header.h桥接头文件如图下图:

    这里写图片描述

    当然你也可以在Building Settings中自己设置桥接头文件,如下图:

    这里写图片描述

    创建好OC_Swift-Bridging-Header.h文件后,在OC_Swift-Bridging-Header.h文件中即可import需要提供给Swift的Objective-C头文件,Swift即可调用对应的Objective-C文件。同时Xcode可以自动生成Objective-C对应的Swift接口。

    ( PS:Objective-C类、协议、属性、方法、扩展、闭包等所有功能都可以无缝地被转换为Swift接口被Swift文件所调用。)


    • Objc调用Swift

    Xcode会自动为Project生成头文件以便在Objective-C中调用。在Objective-C类中调用Swift,只需要#import “productModuleName-Swift.h”即可调用,Xcode提供的头文件以Swift代码的模块名加上-Swift.h为命名。
    (PS:我这有个通俗的理解方式,不喜勿喷,可能不专业,但是好理解。。 “productModuleName-Swift.h文件可以理解为:这个是Objective-C调用Swift的,你写的swift文件在这个文件里对外提供了OC使用的接口,OC调swift,引入这个文件,相当于直接可以使用对外接口了,你可以通俗理解 平常OC的.h文件留的接口)
    在这个头文件中,将包含Swift提供给Objective-C的所有接口、Appdelegate及自动生成的一些宏定义。

    在大部分情况下,Objective-C都可以无缝地调用Swift,但是由于Swift相对于Objective-C多了一些新特性,比如泛型、元组、枚举的等,所以Swift暴漏给Objective-C的接口多了一些限制,因此Swift只能暴露在Objective-C中有效的接口。

    展开全文
  • 前言 hihi,勇敢的小伙伴儿们大家好,我们有一个项目许久未更新了,所以代码有很长一段时间没有运行过,这两天想参考原项目的功能...因为项目是混编的原因,Swift的使用直接导致了这次错误的出现。 问题出现及解决...

    前言

    hihi,勇敢的小伙伴儿们大家好,我们有一个项目许久未更新了,所以代码有很长一段时间没有运行过,这两天想参考原项目的功能和设计,所以要运行起来安装到设计人员手机中,给她作为设计的参考,但是运行起来出错不断,原先可以顺利运行的项目报错了。

    面对这些突如其来的问题,不怂,错误不可避免,解决就可以了。

    正文

    因为项目是混编的原因,Swift的使用直接导致了这次错误的出现。

    问题出现及解决步骤如下:

    首先,Xcode提示:

    意思就是Xcode10.1不支持的Swift3.x

    那哪里用的Swift3.x呢?不妨编译一下看看。出现错误如图:

     

    很清晰了,分别在以上几个马赛克target中使用了Swift3.0,那么如何解决这个问题呢?

    在Target中找到Build Settings在搜索框搜索swift language~

    把Swift Language Version修改成支持的Swift版本就可以了~

    再运行就不会出现上述错误,但是可能会出现别的问题,如果提示OC调用Swift文件中的方法找不到的时候,下面的做法可能会帮助到你:

    在类前加@objcMembers就能顺利生成OC方法直接调用就可以啦~

    运行项目->成功运行(耶)

    如有问题,还请大家指出,多谢各位~

    展开全文
  • 原有的项目都是使用OC写的,既然要在原有项目中引入swift文件首先就要实现OC和swift混编设置。 混编设置: 在OC项目中创建一个swift文件的时候首先Xcode会弹出一个提示框: 这时我们要选择“Create ...

    背景:

    最近又开始看了一些关于Swift的视频、博客、书,发现swift相对于OC使用起来更简洁了,于是就想在原有项目中引入swift。原有的项目都是使用OC写的,既然要在原有项目中引入swift文件首先就要实现OC和swift的混编设置。

    混编设置:

    1. 在OC项目中创建一个swift文件的时候首先Xcode会弹出一个提示框:

    这里写图片描述

    这时我们要选择“Create Bridging Header”,这样就会在项目中生成一个进行OC和swift桥接的.h文件文件和我们要创建的一个swift文件。

    1. 将“Build Setting”中的“Defines Module”设置为“Yes”。

    这里写图片描述

    设置Defines Module
    3. 在项目中创建一个.h文件,文件名:“项目名称-Swift.h”,如:OCAndSwift-Swift.h,创建完成之后我们在需要引入swift文件的OC文件中引入这个.h文件,然后在工程中将此.h文件删除,command + shift + K 即“clean”一下,项目便不会报错了。

    1. 创建一个swift文件,在要使用该swift文件的OC文件中直接使用该swift文件即可,都不用引入此swift文件。如果在OC文件中无法使用此swift类,我们只需command + shift + R一下即可。

    下面附上一个小demo的地址:https://gitee.com/liangsenliangsen/oc_and_swift_mixed.git

    本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。

    展开全文
  • OC和Swift是苹果爸爸的原生语言,Swift代替OC的成本太高,需要过度时间,但是现在的Swift的成长很快,在这个矛盾的时间,我们必须混编了。 1、创建一个新的工程 ,工程的名字叫OCAndSwiftDemo。 2、配置工程...
  • OCSwift混编

    2018-07-19 11:31:59
    首先要说明的是,混编时,比如工程原先用oc,你突然创建了一个swift文件,那么xcode会弹出一个是否创建侨界文件的提示,点击是(不点击也行,在系统工程配置文件里修改桥接文件也可以,桥接文件命名类似:“工程名-...
  • OCswift混编

    2019-02-20 00:38:40
    相信很多iOS开发或多或少已经使用过swift,由于维护的项目时间比较久了,以往都是使用OC开发,现在正在对已有一些功能进行改版重写,索性使用swift来做,以下是在使用OCswift进行混编过程的一些介绍。一、工程配置...
  • 相信很多开发者在开发过程中,使用别人封装好的三方框架,但由于三方框架的开发语言(OC或者Swift)与现有工程的开发语言不一致,导致无法直接使用,那么对于混编来说,是不二的选择。 Swift项目使用OC框架   1...
  • OC和Swift混编(惊喜!)

    2015-05-12 20:30:25
    今天在一位前辈交流的之后,使用了OC和Swift混编开发,遇到了一个让我忍不住要欢呼的情况,在这里,跟大家分享一下,也再次赞叹一下XCode的强大.OC和Swift混编出现最多的就是在编写Swift代码的过程中使用OC框架了....
  • OC和Swift混编Pod引入第三方库的问题 问题描述:Swift应用OC 的开源框架,需要创建一个桥接头文件,问题就出在这个看似简单,却隐藏着一个巨大的问题:一切都按部就班的在桥接头文件中引入了OC 头文件,但是...
  • 在做swiftOC混编的时候,我返现一个很诡异的问题:当我写了一个新的swift文件过后,打开-swift.h这个文件观察,你会发现,并没有及时更新相应的头文件。这说明如果此时你选择用OC调用这段代码会导致你的项目报错...
  • 关于OCSwift混编过程中 “xxxx-Swift.h”为找到的问题 在对OCSwift混编中,加了3个target: 但是在混编过程中,某两个Target 提示找不到 “xxxxx-Swift.h” 在网上找了很多资料,说“xxxx-Swift.h”名字必须与...
  • 就在15年WWDC上更是把Swift进行了开源,瞬间star就开始不断飙升,截止今天(16年1月25)已经达到26059个star【源码请点击这里】,而且每天还都在不断增长,而且每天都会有Pull Requests。这足以说明全球开发者对这门...
  • 环境介绍: mac OS sierra 10.12.6 ... 目标:用Swift4.0版本版本进行普通混编开发(此外还有开发Framework混编、引用外部Framework宿主App混编)。 普通混编说明 Swift访问OC OC访问Swift ...
  • Swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好...这里主要介绍swift类中调用OC方法和swift类中调用C函数以及OC类中调用swift的函数这三种类型的混编.
  • OCswift3.1混编

    2017-05-22 18:09:27
    自从2015年7月,本人写了第一篇swift的文章到现在已经很久没有更新关于swift的内容。 每当swift1 -> swift2 -> swift3的时候都有一股莫名的... swift的学习学了不用,进步始终是甚微的。还是要在真正的项目中使用才...
  • OCSwift混编注意点

    2019-09-25 10:41:25
    生产的test-Bridging-Header.h 为OC桥接文件 ,Xcode会自动配置 配置使OC能调用swift类 然后在需要调用swift类的地方加上头文件格式为:$(TARGET_NAME)-Swift.h 注意:有些时候会报此文件找不到的错误,那是因为...
  • 参考:https://www.cnblogs.com/mazhiqiang/p/5557002.html=============swift中...在swift项目中创建一个OC文件的时候,Xcode 会提示创建一个桥接文件 点确定创建桥接文件,Xcode会自动创建一个桥接文件名字:工...
  • OC和Swift混编 a. Swift OC 的映射关系 Swift 兼容来大部分 OC,当然还有一些 Swift 不能够使用的,例如 OC 中的预处理指令,即宏定义不可使用,虽然在目前4.2版本下,已经开始支持了少量的宏,如 #if ...
1 2 3 4 5 ... 20
收藏数 931
精华内容 372