精华内容
参与话题
问答
  • OC Swift 混编

    2017-08-30 13:29:16
    首先承认我落后了,到今天才开始在项目里用swift,而且还不是全部的用,只是ocswift混编,因为实在是进入项目的时候框架已经用oc搭好了啊啊啊啊啊。只能退而求其次,混编了,大致根据百度到的方法试了一下,不是很...

    首先承认我落后了,到今天才开始在项目里用swift,而且还不是全部的用,只是oc和swift混编,因为实在是进入项目的时候框架已经用oc搭好了啊啊啊啊啊。
    只能退而求其次,混编了,大致根据百度到的方法试了一下,不是很难,总结起来就是两点:
    一、oc工程混编swift文件
    1.新建swift文件,首次新建的时候会提示是否创建桥接文件,选择创建,不要修改文件的名字,一般默认是 工程名+“-Bridging-Header.h”,这是swift调用oc的时候用到的,只要按照oc的方法把oc类的头文件导进来就好了,像这样

    #import "XXXXXXXX.h"

    然后在swift文件就可以调用oc了

    2.上面是swift调用oc,至于oc怎么调用swift就更简单了,创建swift文件的时候系统会自动创建Swift文件对应的Objective-C的头文件,一般默认为 工程名+“-Swift.h”,一般不做改动,而且平时你也看不到这个文件,只有导入了这个头文件,然后点进去,你才能看到文件的内容,如果写头文件时候不提示,clean一下。。。
    (注:如果过程中出现不提示或者编译不通过的情况,clean一下试试,一般就没问题了,如果还有问题,一定是上面还有哪没做好,请重试)
    二、swift工程混编oc文件
    还没有尝试,待续。。。

    展开全文
  • oc swift 混编

    2016-03-12 18:53:22
    几个月后Swift 2.0发布时,我们开始慢慢采用Swift。8个月之后--100%的新代码都是用Swift写的。所有这些工作都没有重写现有的,运行良好的,健壮的、经过测试的Objective-C代码--这样做已经没有什么意义了。 市面...

    2015年3月起我们着手用Objective C开发Skyscanner TravelPro应用。几个月后Swift 2.0发布时,我们开始慢慢采用Swift。8个月之后--100%的新代码都是用Swift写的。所有这些工作都没有重写现有的,运行良好的,健壮的、经过测试的Objective-C代码--这样做已经没有什么意义了。

    市面上有很多论述如何决定是否要将Swift应用在新项目中的资料,以及Swift的最佳实践。如果你是在具备相当规模的Objective-C代码库上做开发,你或许会发现这篇文章很有用。如果不是--有一天也许你会碰到希望能用Swift来开发的项目:这篇文章提供了关于如何开始的建议。

    所以我们通过什么途径从Objective-C过渡到Swift呢?

    1.从简单的部分入手

    我们决定从尽可能简单的部分入手,例如一些独立的可以自测和内部调用的类。我们最初选择的部分是简单的UI控制代码、实用函数以及已有类的扩展方法。

    例如在最初加入的Swift组件中,我们写了一个String的扩展方法来使本地化字符串读起来更舒服:

    1
    2
    3
    4
    5
    6
    extension String {
       var localized: String! {
          let localizedString = NSLocalizedString(self, comment: "")
          return localizedString
       }
    }

    有趣的是我们本可以用Objective-C的分类来实现相同功能。然而我们团队再也不会去使用陈旧的NSLocalizedString(@"MyText", @"")许多新的思路随着运用一门新语言而浮出水面。所以从使用Swift开发的第一天开始我们的Swift字符串都是写成"MyText".localized格式。

    2.从Swift中调用已有的Objective-C代码

    在写了一些独立的Swift组件并对它们进行单元测试后,我们开始用Swift调用已有的Objective-C的类。一切都开始变得实际起来。

    要从Swift调用Objective-C的类你需要定义Swift桥接头文件。这是一个.h文件,用来定义所有能暴露给Swift调用的Objective-C头文件。在文件的开头,需要修改编译设置来让编译器在编译的时候把它加进去。当这一切完成后,这些Objective-C的类就被导入进Swift的世界,能被Swift很方便地调用。

    当你在Swift中调用Objective-C类时,你可能会收到一个警告:pointer is missing a nullability type specifier。当Objective-C代码被导入到Swift,编译器会检查nullability compatibility--如果没有任何关于nullability的信息,这个提示就会出现。要做这个检查是因为在Swift中nullability信息都是显式申明的,不论是非空类型还是可选类型。

    我们唯一需要做的仅仅是在被调用的Objective C头文件中加入nullability信息来消除这些编译器警告。我们使用新的nullablenonnull标注来达成这一目的。重置工作仅仅只需要花几个小时,因为我们只需要修改我们在Swift中用到的类,无非是几百行的代码。然而,做这些修改时我们绞尽脑汁思考在已有代码库中哪些可以或不能被设置成nil,但当我们把这些代码暴露给Swift时我们无法避免的要做出一个明确的抉择。

    在大部分情况下,重构涉及到一些像这样的修改:

    1
    2
    3
    4
    5
    // 在.h文件中原来的方法签名
    @property (nonatomic, strong, readonly) THSession *session;
      
    // 新的,Swift友好型的方法签名
    @property (nonatomic, strong, readonly, nullable) THSession *session;

    在方法签名中存在block时,修改会略微复杂,但是没有不可掌控的:

    1
    2
    3
    4
    5
    // 在.h文件中原来的方法签名
    - (NSURLSessionDataTask *)updateWithSuccess: (void(^)())success error:( void(^)(NSError * error))error;
      
    // 新的,Swift友好型的方法签名
    - (nonnull NSURLSessionDataTask *)updateWithSuccess: (nullable void(^)())success error:(nullable void(^)(nonnull NSError *error))error;

    3.在Objective C调用Swift代码

    在有不少复杂度适中的使用了Objective-C类的Swift组件后,是时候在Objective C里面调用这些组件了。从Objective-C中调用Swift组件更直接,因为不需要额外的桥接头文件。

    唯一需要对现有Swift文件做修改的是继承NSObject或给我们希望暴露的Swift类添加@objc属性。有一些特殊的Swift类Objective-C无法使用,像结构体(structures),元组(tuples),和泛型(generics),以及一些其他的类。这些限制不会造成什么影响,因为我们不想把任何新的结构暴露给Objective-C。唯一我们需要做些额外处理的特例是枚举类型。要使用Swift中定义的枚举类型,需要在Swift中明确申明Int值类型:

    1
    2
    3
    @objc enum FlightCabinClass: Int {
       case Economy = 1, PremiumEconomy, Business, First, PrivateJet
    }

    4.从Swift角度重拾单元测试和依赖注入

    当我们有更多复杂的模块使用了依赖时,我们遇到了一个没有明确解决方案的问题:单元测试。不像Objective-C,Swift不支持读写反射。简单来说,Swift中没有与OCMock等价的库,事实上mocking框架并不存在

    这里有一个令我们抓狂的例子。我们希望测试当我们在一个页面点击提交按钮时,saveTrip方法能被view对象的viewModel属性调用。在Objective-C中,使用OCMock,测试起来非常轻松:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 测试当点击了提交按钮,ViewModel上的一个方法被调用
    - (void)test_whenPressingSubmitButton_thenInvokesSaveTripOnViewModel {
       // given
       TripViewController *view = [TripViewController alloc] init];
       id viewModelMock = OCMPartialMock(view.viewModel);
       OCMExpect([viewModelMock saveTrip]);
      
       // when
       [view.submitButton press];
      
       // then
       OCMVerifyAll(viewModelMock);
    }

    在Swift中这个方法不起作用。Objective-C单元测试常依赖于像OCMock这样完善的模拟框架。依赖注入是一个很好的实践,但因为OCMock让单元测试变得非常简单,甚至不需要显式的依赖注入,我们大部分的Objective-C依赖是隐式的。而在Swift中,像OCMock这样的动态模拟库并不存在。在Swift中唯一可以写出能测试代码的方式是让依赖变得显式和可注入。一旦这个解决后,你需要自己写模拟对象去验证行为。

    重新审视前一个例子:在Swift中需要做修改,让viewModel可以作为view的依赖被传递。只要viewModel实现了协议,或者继承viewModel就能实现。测试类需要定义用来传递的模拟对象:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    func test_whenPressingSubmitButton_thenInvokesSaveTripOnViewModel() {
       // given
       let viewModelMock = TripViewModelMock()
       let view = TripViewController(viewModelMock)
      
       // when
       view.submitButton.press()
      
       // then
       XCTAssertEqual(viewModelMock.saveTripInvoked)
    }
      
    class TripViewModelMock: TripViewModel {
       var saveTripInvoked = false
      
       override func saveTrip() {
          self.saveTripInvoked = true
       }
    }

    Swift测试代码看起来要比Objective C版本更加冗长。事实上,显示依赖注入模式会让我们更关注尽可能减少代码的耦合度。在迁移到Swift之前,我们认为我们的Objective -C代码耦合度很低了。写了几周Swift代码后,'老'代码和'新'代码之间的差异越来越凸显。迁移到Swift并正确地测试代码让我们的代码库耦合度更低。

    渐入佳境

    在找到依赖注入的窍门并用这个方法来写我们自己的模拟对象后,我们在Swift中挖掘得更深入了,开始挑选一些别人未尝涉入的技术。在前一个例子我展示了如何重建Objective C的OCMPartialMock功能。一个更清晰的方法是用pure mocks而非partial mocks。在Swift中写灵活的,低耦合代码的更好方法是使用协议,以及面向协议编程技术。我们很快选择了这个方向,代码变得耦合度更低且更易测试。

    新语言就有新的语言特性,像guard和defer泛型generics、用do-catch嵌套类型(nested types)、where clause@testable关键字进行的错误处理(error handling),这些仅仅是冰山一角。即便如此Swift依旧很容易上手,有很多内容值得深入研究。

    除了学习一门新语言外,我们还从迁移到Swift学到了什么呢?

    更易读的代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // Objective C
    [self addConstraint:[NSLayoutConstraint constraintWithItem: myButton
                         attribute: NSLayoutAttributeCenterX
                         relatedBy: NSLayoutRelationEqual
                         toItem: myView
                         attribute: NSLayoutAttributeCenterX
                         multiplier: 1.0
                         constant: 0.0]];
      
    // 用Swift写的同样的代码
    self.addConstraint(NSLayoutConstraint(item: myButton,
                                          attribute: .CenterX,
                                          relatedBy: .Equal,
                                          toItem: myView,
                                          attribute: .CenterX,
                                          multiplier: 1.0,
                                          constant: 0.0))

    与Objective-C相比,更苛刻的编译时检查。除了类型安全和编译时间因此获益外,Swift编译器还对一些像if表达式不允许只有一行(not allowing single line if statements )或强制switch表达式把情况列举全面(enforcing exhaustive switch statements)等条件做了额外检查。

    摆脱头文件。以及不再需要在.h.m文件之间切换来复制方法申明。

    当然还有学习和使用新语言特性带来的恐惧

    相对优势,劣势的地方可以说是出人意料的少。一个明显的不便是我们的一些第三方依赖--像JSONModel--是建立在Objective-C动态特性上的,而这在Swift上并不管用。另一个问题是我们需要维护现存的Objective-C代码,这意味着额外的环境转换和动机去不断把更多的Objective-C代码转换成Swift代码。

    当然Swift仍是一门新语言,在2016年晚些时候会有轰动的变化。尽管这样,我们的团队认为把我们的Objective-C代码转换到Swift这个项目取得了成功。它使结构更加清晰,代码更加易读,以及比之前使用Objective-C开发的时候更加高产。更重要的是:在保证平缓的改变以及不重写'老'代码的基础上,从Objective-C过渡到Swift没有丝毫降低我们的进度

    展开全文
  • OC Swift混编

    2018-08-01 10:30:45
    因最近准备切换公司Objective-C(下面简称OC)项目为Swift项目,切换过程中不可避免地涉及到混编这一块,特此记录下来, 主要分为在swift项目中调用OC文件 和在OC项目中调用swift文件 在Swift工程或者文件使用...

    前言

    因最近准备切换公司Objective-C(下面简称OC)项目为Swift项目,切换过程中不可避免地涉及到混编这一块,特此记录下来, 主要分为在swift项目中调用OC文件 和在OC项目中调用swift文件

    在Swift工程或者文件使用Objective - C文件

    • 在OC项目中添加swift文件或者在swift项目中添加OC文件(创建的文件必须是继承与NSobject或者间接继承与NSobject)

    • 这时会提示你是否添加桥接文件,点击创建后体统会自动创建一个桥接文件,但是如果点击取消后,就需要自己建桥接文件;

    • 不过名字必须是“ProjectName-Bridging-Header.h”头文件(名称组成:工程名-Bridging-Header.h),如果名字记不清也可以自己新建Header file后,在Targets→Build Settings→Swift Compiler - General→Objective-C Bridging Header配置文件路径,这个文件主要是Swift使用OC类时使用

    • 在桥接文件即projectName-Bridging-Header.h文件中引入需要的OC头文件,具体使用,按照对应的Swift语法结构来即可

    在Objective - C工程或者文件使用Swift的文件

    • 在OC中调用swift需要先import桥接文件(项目名-Swift.h,自动生成)
    • 这个文件是混编时,系统生成的Swift文件对应的Objective-C的头文件,具体可以在Targets→Build Settings→Swift Compiler - General→Objective-C Generated Interface Header Name进行配置,默认文件名是工程名-Swift.h,一般不做改动。
    • 这个文件虽然在工程中看不到,但是她真实存在,编译后,你可以按住Command+单击该文件名,就会看到具体生成的代码
    • 引入后,具体类的使用,直接按照OC的方式使用即可。

    注意事项

    • 对于需要混编的Swift类添加@objc声明或继承NSObject或NSObject的子类如果要在Objective-C类中使用TestClass类,应当使用@objc加以声明,或者将TestClass继承自NSObject或NSObject的子类,否则,引入ProductName-Swift.h之后,程序找不到对应类。
    class TestClass {
    
    // 属性
    
    // 实现
    
    }
    复制代码
    • 在swift类中调用OC文件中的单例时,OC单例方法命名强制为share开头,否则在swift文件中找不到该方法

    • 使用第三方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) 
    }
    复制代码

    转载于:https://juejin.im/post/5b615d3ce51d45191e0d221f

    展开全文
  • OC Swift混编 记录

    2019-08-14 16:17:40
    OC 项目混编SwiftOC项目中初始创建swift文件时,会提醒创建桥接文件 点击 Create Bridging Header 就会生成一个桥接文件 如果误点导致没有创建桥接文件,可手动创建一个 “工程名-Bridging-Header.h" 的...

    OC 项目混编Swift

    1. 在OC项目中初始创建swift文件时,会提醒创建桥接文件

      点击 Create Bridging Header 就会生成一个桥接文件

      如果误点导致没有创建桥接文件,可手动创建一个 “工程名-Bridging-Header.h" 的头文件,然后在工程中配置文件(参考下一步)

    2. 工程配置
      target | Build Settings
      在这里插入图片描述
      在这里插入图片描述

    3. swift 引用 OC
      在桥接文件中导入Swift需要访问的OC类,.Swift文件中即访问OC的类了

    4. OC 引用 Swift
      需要导入隐式头文件:xxx-Swift.h,xxx-Swift.h在项目中是看不到的,但是确实是可以import的
      编辑import时,Xcode 并不会有导入该头文件的快捷提示
      我们可以创建一个头文件,然后在该头文件中引入这个隐式头文件:

    问题

    1. OC 中无法调用Swift的方法:

    Swift4新特性介绍3(Substring、swap、@objc)

    隐式 @objc 自动推断

    class SwiftClass { }
    
    @objc extension SwiftClass {
       func foo() { } //包含隐式的 @objc
       func bar() { } //包含隐式的 @objc
    }
    

    2. 无法引用class.

    class 需要继承 NSObject

    3. 无法使用swift定义的enum

    在这个枚举前加上 @objc( 枚举 )即可

    @objc(DMSCropProportionOrientation)
    enum DMSCropProportionOrientation: Int {
        case unknown    = -1 
        case landscape  = 0 
        case portrait   = 1 
        case auto       = 2
    }
    
    
    展开全文
  • oc swift 混编 特技

    2015-07-14 09:42:00
    1.swift 工程新建oc文件,新建的时候提示是否桥接文件,点击yes,把swift要用的oc文件的头文件 都导入桥接文件中就OK了。 2.在swift工程中oc调用 swift文件,需要在导入名字是"工程名字-Swift.h"即可 如下所示 1...
  • 初试OC Swift 混编

    2020-07-03 13:51:09
    初尝OC swift 混编新的开始!项目配置文件相互访问方法和常量变量的相互访问零碎的乱七八糟的东西总结 新的开始!...示例为老OC项目加入swift混编. Xcodeb版本11.5 Swift版本5.0 首先创建第一个.swi
  • swift学习1 oc swift混编

    2015-08-05 22:33:13
    1.creat swift project 2.set project architecture 3.creat bridege header 4.add new oc file 5.import "file.h
  • oc swift混编实践问题总结

    千次阅读 2016-09-27 17:46:37
    所以,我们团队开始尝试探索把我们庞大的项目实现ocswift混编。至于为什么不直接重构,那是因为实在是时间和事实不允许,毕竟我们的APP已经是好几年的庞然大物了。  言归正传,我开始尝试着用swift来重写一个oc...
  • 用到的知识就是swift的闭包原理。 swift页面:返回的值是一个字典 typealias chidernInfo = (NSDictionary)->Void var childern: chidernInfo? 在button点击的方法里面实现: self.childern!...
  • 2016.09.13 11:53*字数 266阅读 1935评论 1喜欢 1 ...今天碰到个神坑,本人项目是OC项目...但是,在替代的已开始就出现问题了:新建swift文件,然后提示创建bridging-Hearder文件,然后swift可以使用OC代码了.这些都...
  • 前言 hihi,勇敢的小伙伴儿们大家好,我们有一个项目许久未更新了,所以代码有很长一段时间没有运行过,这两天想参考原项目的功能...因为项目是混编的原因,Swift的使用直接导致了这次错误的出现。 问题出现及解决...
  • 混编方式 可能出现的问题,文件位置设置完成之后仍然无法使用,报错为“Failed to import bridging header” 检查 是在project中而不是targets 2.framework search path 是否设置正确,并且也是在pr
  •   在OC swift混编后打包由于SwiftSupport支持文件会导致混编后的打的包文件会偏大。 ####解决方法 Build Setting -&gt; User-Defined -&gt; EMBEDDED_CONTENT_CONTAINS_SWIFT 设置为NO #####相关链接 ...
  • 1.swift 混编 oc 第一步:新建一个swift 的工程 第二步:新建或者导入oc文件,在这里我新建了一个oc的视图 第三步:新建桥文件 在桥文件中导入相应的头文件 第四步:设置相应...
  • ocswift混编

    2019-02-27 20:45:40
    这是需要做ocswift混编需要用到的,现在oc的发展变慢,swift成长很快,需要这种技术的请下载,如果不是做ios的请慎重
  • ocswift混编OC调用swift,swift调用OC
  • OCSwift混编.pdf

    2020-05-06 17:03:05
    OC混编Swift, Swift项目混编Objective-C Framework Target混编Swift 怎么遵循 OC运行时 混编的一些坑
  • OCSwift 混编 OC 中调用 Swift

    千次阅读 2016-02-18 16:38:07
    1、创建一个Object-C工程:SwiftInObjectC 2、创建一个Object-C的类:SwiftLan(注意选择) ...当创建完成后,Xcode提示下面警告,会提问我们需不需要创意一个Bridge,当然我们选择“Yes”。...
  • OCSwift混编的三种情况: 1、OC工程中写入Swift文件并随手创建桥接文件 2、Swift工程中写入OC文件并随手创建桥接文件 3、混编时舍弃创建桥接文件,手动再创建一遍的方法
  • OCSwift混编

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

    千次阅读 2016-09-25 23:49:18
    相信很多iOS开发或多或少已经使用过swift,由于维护的项目时间比较久了,以往都是使用OC开发,现在正在对已有一些功能进行改版重写,索性使用swift来做,以下是在使用OCswift进行混编过程的一些介绍。一、工程配置...
  • swift之OCSwift混编

    2017-08-13 16:46:00
    1、在Swift工程添加OC代码 在swift语言里,同一个项目内的文件基本会放在同一个命名空间里,所以没有.h文件。如果想在swift工程中添加OC代码,需要解决怎么引用OC代码的头文件问题。具体的解决办法就是:新建一个...

空空如也

1 2 3 4 5 ... 20
收藏数 591
精华内容 236
关键字:

ocswift混编