• 使用Cocoapods 工具导入的第三方Swift 框架 ,使用的时候则需要 导入相应的头文件 demo 中使用 Cocoapods 导入了 Alamofire 和 SwiftyJson 两个第三库,倘若要使用第三方库中的类和方法,则需要到入相应的头文

    转自:https://www.jianshu.com/p/8589dd2e11ed

     

    1.1 引用自己工程中的 Swift  文件

    swift 工程中,使用自己创建的 Swift 类文件是不需要导入头文件的,可以使用。这是因为 Xcode 强大的功能默认帮我们进行了处理,不要我们在做 import 操作,相反如果使用 import 导入自己创建的 Swift 类文件则会出现报错。

     

    1.2 引用通过 Cocoapods 导入第三方 Swift 框架中文件

    使用 Cocoapods 工具导入的第三方 Swift 框架 ,使用的时候则需要 导入相应的头文件 

    demo 中使用 Cocoapods 导入了 Alamofire 和 SwiftyJson 两个第三库,倘若要使用第三方库中的类和方法,则需要到入相应的头文件:创建了一个继承自 NSObject 的 NetworkRequest 类,在 NetworkRequest  类中需要使用以上两个第三方库,所以要导入头文件:

    import  Alamofire

     import  SwiftyJSON

     

    2.1 引用自己工程中的 OC 文件

    在 Swift 项目中使用 OC 文件则要建立和 OC 的桥接头文件,一般使用 OC 创建文件,或是拉入一个 OC 类,都会提示创建创建桥接文件

    Xcode 在创建 OC 类的同时会自动生成一个桥接头文件  SwiftProject-Bridging-Header.h ,交接文件在工程中的链接也是 Xcode 帮我们自动设置好的。此时需要做的就是在 桥接头文件中导入 OC 类的头文件: #import  "OCViewController.h"。这样在 Swift 文件中就可以使用 OC 类: 

    let ocVC = OCViewController.init(nibName:"OCViewController", bundle:nil)

     

    2.2 引用通过 Cocoapods 导入第三方 OC 框架中文件

     

    使用 Cocoapods 工具导入第三方 OC 框架,此时 Xcode 不会帮我们创建桥接头文件, 

    A.   如果工程中已有 OC 的桥接头文件,则在头文件中导入第三方框架类的头文件即可使用, 但是需要增加一步设置:



     

     

    展开全文
  • Swift中不需要互相引入头文件,但是一些全局的常量和宏我们可以写在一个公共的文件中,用来替代OC中pch文件的作用。 1、创建普通的comman.swift文件 2、在comman文件中定义全局参数和常用宏 对于一些常用参数...

    Swift中不需要互相引入头文件,但是一些全局的常量和宏我们可以写在一个公共的文件中,用来替代OC中pch文件的作用。

    1、创建普通的comman.swift文件
    这里写图片描述
    2、在comman文件中定义全局参数和常用宏

    对于一些常用参数,可以直接使用常量设置,例如:

    ///屏幕宽度
    let KScreenWidth = UIScreen.main.bounds.size.width;
    ///屏幕高度
    let KScreenHeight = UIScreen.main.bounds.size.height;

    对于一些带有逻辑控制的宏,我们可以定义成全局函数,例如:

    ///返回图片
    func Kimage(name :String) -> UIImage? {
        return UIImage.init(named: name)
    }
    
    ///返回一个颜色
    func RGBColor(r:Float , g:Float , b:Float) -> UIColor {
        return UIColor.init(red: (CGFloat(r/255.0)), green: (CGFloat(r/255.0)), blue: (CGFloat(r/255.0)), alpha: 1.0)
    }

    在任何地方都可以直接调用,如下:

    print(KScreenWidth , KScreenHeight)
    Kimage(name: "imageName")
    RGBColor(r: 10, g: 20, b: 10)

    3、对于自己创建的swift类,Swift编译器会自动帮你引入头文件。
    对于第三方的头文件就需要在每个用到的地方进行引入,可以在comman.swift中可以引入Swift版的第三方的头文件,这样就不需要在每个地方都进行引入了。(实测Moya和Alamofire、SwiftyJSON还是需要在用到的地方引入,其他第三方可以用此方法。)

    以上只适用于纯Swift编写的代码,如果要引入OC头文件,参考Swift中引入OC类库的头文件博客

    展开全文
  • 在OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。 特别注意 1、被使用的Swift的类必须是至少继承自NSObject的,不然OC识别不了这个类。 2、Swift中的属性和方法,要加上@objc...

    Swift中引用OC看这篇
    在OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。

    特别注意
    1、被使用的Swift的类必须是至少继承自NSObject的,不然OC识别不了这个类。
    2、Swift中的属性和方法,要加上@objc标识,不然识别不了。

    代码如下,Swift中定义了一个类,这个类有一个类属性和一个类方法。

    class UUUU:NSObject {
        @objc static var yyy:String?
        @objc static func test()->(){
            print("XXXX")
        }
    }

    在OC需要用到的地方先引入#import “XXX-Swift.h”,然后就能用了

        UUUU *u  =[UUUU new];
        NSLog(@"%@" , UUUU.yyy);
        [UUUU test];

    Swift中使用类属性和类方法代替宏定义

    另外,在Swift的类中,可以使用只读的类属性和类方法来代替OC中的宏定义,这样定义的宏在OC中直接用,省略了在oc中再定义一次的麻烦。代码如下

    class UUUU:NSObject {
        //只读的类属性
        @objc static var name:String{
            return "jim"
        }
        //类方法
        @objc static func RGBColor(r:Float , g:Float , b:Float) -> UIColor {
            return UIColor.init(red: (CGFloat(r/255.0)), green: (CGFloat(r/255.0)), blue: (CGFloat(r/255.0)), alpha: 1.0)
        }
    }

    另一种Swift代替宏定义的方法是使用全局变量和全局函数来定义,Swift中使用全局变量和函数代替宏

    展开全文
  • swift 与OC进行混合编码。

    作者:fengsh998
    原文地址:http://blog.csdn.net/fengsh998/article/details/34440159
    转载请注明出处
    如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢!


    swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编。这个在IOS8中是允许的。

    先中简单的入手,先研究在同一个工程目录下混合使用的情况。

    为了演示。先准备两个类

    第一个是swift语言写的类,文件名为 act.swift

    import Foundation
    
    class Act : NSObject
    {
        func hasAct(tag:Int) -> String
        {
            switch (tag)
            {
            case 1:return "Movie"
            case 2:return "CCTV"
            case 3:return "Sport TV"
            default:return "Area TV"
            }
        }
        
        init()
        {
            println("act constructor is called.")
        }
        
        deinit
        {
            println("act destroyed is called.")
        }
    }

    第二个是用OC写的类 头文件为OCChannel.h ,实现文件为OCChannel.m

    头文件

    #import <Foundation/Foundation.h>
    
    @interface OCChannel : NSObject
    
    @property (nonatomic,retain) NSString *ChannelName;
    
    - (NSString *)ChannelChange:(NSInteger) channels;
    
    @end
    

    实现文件

    #import "OCChannel.h"
    #import "SwiftModule-swift.h"
    
    @interface OCChannel()
    {
        Act     *act;  //swift的类
    }
    @end
    
    @implementation OCChannel
    
    - (id)init
    {
        if (self = [super init]) {
            NSLog(@"OC Constructor is called.");
            //使用Swift类
            act = [[Act alloc]init];
        }
        return self;
    }
    
    - (void)dealloc
    {
        NSLog(@"OC Destroyed is called.");
        //[act release];//ARC not use
        //[super dealloc];//ARC not use
    }
    
    - (NSString *)ChannelChange:(NSInteger) channels
    {
        return [act hasAct:channels];
    }
    
    @end

    这个OCChannel为中引用了swift 写的类Act 。主要是为了演示在同一个工程项目里,swift类调用OC,同时OC类也调用Swift。从而形成一种混合编写的模式。


    下面是具体步骤:

    1.新建一个Swift工程:我这里工程名为MixDemo


    建好后工程:


    2.就是分别引入前面的两个类,咱先一个个来。因为建的是Swift,所以,咱先以Swift工程中引用OC文件进行一次混编

    Swift中使用OC

    首先Swift中不再使用头文件和.m文件的方式了。所以也不需要使用import ""来导入头文件。哪swift 如何能访问到OC的类声明的。

    其实,swift也是需要使用头文件进行访问的,只不过不再需要使用显式的方式使用import进行导入。有两种方式来实现这个头文件的生成。

    方式一:在一个全新的Swift,利用第一次新建提示的方式自动添加桥接头文件。




    点确定这后就会生成一个以<produceName-Bridging-Header.h>的头文件。

    建好后的工程:


    这里有一个地方需要注意的就是在targets->build settings ->Object-C Bridging Header 设为哪个桥接的头文件即可。



    经过上述步骤,桥接文件弄好了就可以

    尽情的把想要在swift类中调用的OC头文件放使用import "" 写到这个桥接文件中吧。就像:

    //
    //  Use this file to import your target's public headers that you would like to expose to Swift.
    //MixDemo/MixDemo-Bridging-Header.h
    
    #import "OCChannel.h"
    

    同样的,当你知道这个swift搜索头文件的关系后,就不需要再理会这个-Bridging-Header.h的文件了。完全可以手工建一个并取自己喜欢的名字。如:

    方式二:

    新建一个头文件,名为:OCContainerHeader.h



    好了,以上的设置后就完全满足了Swift使用OC写的类了。

    import UIKit
    
    class ViewController: UIViewController {
                                
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
    
            //调用OC类
            var channel = OCChannel()
            println(channel.ChannelChange(10))
            println(channel.ChannelChange(2))
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
    }

    好了下面再来看一下OC如何调用Swift写的类。(事实上,如果你是一比一抄我这个DEMO,哪么恭喜你,在以上你将编译不通过。因为我的OC类中引用了swfit 写的类,所以你要想运行,就必须把哪个Act 的类注释了才行。)


    OC如何调用Swift写的类

    OC要想使用,必须有头文件。而swift文件却没有头文件,所在咱们想必也需要产生一个头文件。但对于OC调用swift  的头文件比较特殊。因头文件里面的机制是自动生成的,在不熟悉的,不建议手写。

    哪如何产生这个头文件。(注意,系统设置的头文件,在工程中是看不到的。)

    产生步骤:

    选中targets->build settings ->packing->Product Module Name 中设置模块名,这个名称很重要 swift 的头文件就是根据这个来命名的。



    虽然你看图中有这个import "SwiftModule-swift.h"但你在整个工程中是找不到这个文件的,但可以使用CMD+ 鼠标点击可看这个头文件中的内容。



    这样,工程中如查Swift要使用OC,则把需要使用的OC类的头文件,全写在MixDemo-Bridging-Header.h里。同样如果OC中所使用的swift类,只需要Clean一把,再编就可以了,但不要忘了导入SwiftModule-swift.h哦(名称自取,但-swift.h是固定的),另外还有一个需要读者注意的。

    注:

    凡是用Swift写的类,如果不继成自NSObject或NSObject 的派生类,哪么编译后将不会生成对应的转换类。从而使得OC 中找不到相应的声明。

    如我的例子中 class Act 这样不会被编译到SwiftModule-swift.h中,但写为 class Act : NSObject,就可以编译出相应的声明。另外可以使用@objc加以声明,但这个还是一样,类最好继承NSObject下来。就像下面:

    import Foundation
    
    @objc(Act)
    
    class Act 
    {
        func hasAct(tag:Int) -> String
        {
            switch (tag)
            {
            case 1:return "Movie"
            case 2:return "CCTV"
            case 3:return "Sport TV"
            default:return "Area TV"
            }
        }
    
        @objc(init)//原本以为加上这个alloc就可以找到,但不行的。。。
        init()
        {
            println("act constructor is called.")
        }
        
        deinit
        {
            println("act destroyed is called.")
        }
    }

    但是在使用时你就会发现

            act = [[Act alloc]init]; //报错,找不到alloc,因此建议大家还是继承NSObject.



    好吧,今天就写到这里,再研究一下framework之间的混编。。。。。




    展开全文
  • 有段oc代码如下: typedef void(^RootViewMoveBlock)(UIView *rootView,CGRect orginFrame,CGFloat xoffset); @property (copy,nonatomic) RootViewMoveBlock rootViewMoveBlock;...请问用swift怎么调用?
  • 在使用swift和oc混编的时候,swift中是不能导入头文件的; 1.在swift中,第一次创建oc文件时,系统会自动弹出,是否自动创建头文件,这个就不提示了,点击YES,就好 2.还有一种情况是,如果系统没有提示自动...

    开始~~

    在使用swift和oc混编的时候,swift中是不能导入头文件的;

    1.在swift中,第一次创建oc文件时,系统会自动弹出,是否自动创建头文件,这个就不提示了,点击YES,就好



    2.还有一种情况是,如果系统没有提示自动创建,那么我们需要手动创建.

    3.首先跟OC中创建,header文件一样,选择创建 Header File,

    4.下一步,在Build Settings中,找到,Swift Compiler - Code Generation中的,Objective-C Bridging Header,在这里面,输入你创建的头文件的路径,就可以了,步骤看截图

    展开全文
  • swift项目的一个文件中导入所有头文件,在import前面加@_exported 在OC项目中,需要添加一个pch的文件,在other里选择 PCH file,在build settings 里设置 Precompile Prefix Header的值为YES,并设置Prefix ...
  • 1 swift项目,找不到第三方文件,exp:AFN.h找不到,要修改build settings 里的User header custome search paths ,改成${SRCROOT},选择recursive.2 oc项目找不到swift文件,要引入工程名-swift.h文件。A.设置...
  • 我们知道一般情况下Swit要想调用obj-c,c或c++代码必须通过obj-c以及桥接文件才可以办到,但是对于某些简单的代码,我们可以跳过桥接文件和.h头文件,直接和C代码交互呢!我们再Project中添加一个.c文件,不要创建桥接文件...
  • 在OC中头文件互相引用是很常见的一件事,如: A的头文件#import "B.h" 而B的头文件#import "A.h" 这个时候就会出现意想不到的问题。系统会在你实例化A类型的的变量的时候报错,把你弄得很惆怅也不知道是哪里错了。 ...
  • 由于最近开发一个项目,需要用到百度地图API,于是使用pod添加了百度地图的库,podfile如下: # Uncomment the next line to define a global platform for your project # platform :ios, '11.4' ...
  •  今天准备写一个Demo的时候遇到一个不可思议的问题,就是不管我怎么弄,在pch文件中引入头文件就是报错,说找不到那个文件,可是文件名我都是用自动辅助功能打出来的怎么可能找不到呢。  再详细的分析之后发现...
  • 如果你想引用头文件,且头文件里是引用.h的文件 ,你需要注意  1.在Build Settings下 找到Swift Compiler - Code Generation 下的 Objective-C Bridging Header 选项,并将其值设值为你的头文件路径  2.Apple ...
  • 15.7 Swift全局引用

    2017-01-17 14:17:01
    /**  全局引用  全局引用作用域是:定义的位置处开始,文件结尾处结束。  生命周期:跟当前程序的声明周期相同。  所以呢能写成局部的就用局部的,全局的必须等该Controller销毁时才销毁啊。...
  • 但是问题来了,当你使用cocoapods导入的OC三方类,swift里面却找不到这个头文件,很是吓JB扯淡的。遇到这些问题真的很少脑筋!还好通过查找资料解决了! 以下是解决方法,希望对大家有帮助 第一步:选择Target -&...
  • ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:...
  • Swift项目引入第三方库的方法 转自 http://blog.shiqichan.com/How-To-Import-3rd-Lib-Into-Swift-Project/ 以下,将创建一个Swift项目,然后引入3个库: Snappy 简化autolayout代码的库...
  • 1.首先新建个 swift工程 2.在swift 中新建 OC 类 比如新建 Request 类,会自动生成个。XXXX-Bridging-Header 类; 3.让后把 导入的第三方头文件导入进去。例如: #import "AFNetworking.h" 但是他会提示找不到 ...
  • 最近使用swift的时候引用了OC文件,就给大家说一下我的个人经验,以供大家参考。 一、是直接将OC文件拉到Swift的工程中,然后Xcode会自动创建桥接头文件,这种就比较省事了,Xcode给你自动创建。 二、就是Xcode...
1 2 3 4 5 ... 20
收藏数 2,514
精华内容 1,005