object 调用swift_swift object c - CSDN
  • 1、创建一个Object-C工程:SwiftInObjectC 2、创建一个Object-C的类:SwiftLan(注意选择) 当创建完成后,Xcode提示下面警告,会提问我们需不需要创意一个Bridge,当然我们选择“Yes”。 这样会在工程中看到一...

    1、创建一个Object-C工程:SwiftInObjectC


    2、创建一个Object-C的类:SwiftLan(注意选择)


    当创建完成后,Xcode提示下面警告,会提问我们需不需要创意一个Bridge,当然我们选择“Yes”。


    这样会在工程中看到一个“SwiftInObjectC-Bridging-Header.h”文件。这个文件的作用可以根据注释看出来:


    //
    //  Use this file to import your target's public headers that you would like to expose to Swift.
    //
    

    3、下面一步是我们要修改“Bulid Setting” 中的 Defines Module 设置为“Yes” ,同时再看看Product Name 是不是工程的名字。如果是就不用管了

    如果不是就改为工程名字。


    4、在ViewController中引入头文件 #import "SwiftInObjectC-Swift.h"SwiftInObjectC是设置的Product Name

    5、在修改我们创建的SwiftLan 类如下:

    class SwiftLan: NSObject {
    
        /*
        // Only override drawRect: if you perform custom drawing.
        // An empty implementation adversely affects performance during animation.
        override func drawRect(rect: CGRect) {
            // Drawing code
        }
        */
        @objc(initWithData:)
        init(data: String){
            println(data);
        }
    
    }

    6、在ViewController类中创建实例子如下:

       SwiftLan *tempString = [[SwiftLan alloc] initWithData:@"Test Swift"];
       NSLog(@"%@",tempString);

    7、然后Build & Run 可以在 控制台看见:


    运行OK,说明我们已经成功在OC中使用了Swift 方法和类。

    8、下面看看二个动效的Swift类,同样的方法:

    [self.view addSubview:({
            NVActivityIndicatorType type  = NVActivityIndicatorTypePacman;
            NVActivityIndicatorView *temp = [[NVActivityIndicatorView alloc] initWithFrame:CGRectMake(0,0,80,80) type:type];
            temp.center = self.view.center;
            [temp startAnimation];
            temp;
        })];
        
        [self.view addSubview:({
            _testLabel = [[LTMorphingLabel alloc]initWithFrame:CGRectMake(0,200,self.view.bounds.size.width,80)];
            _testLabel.text = @"";
            _testLabel.textAlignment = NSTextAlignmentCenter;
            _testLabel.textColor = [UIColor whiteColor];
            _testLabel.font = [UIFont systemFontOfSize:28];
            _testLabel;
        })];
    效果如下:


    9、说明的一点是Swift的 Enum和 OC的 Enum 的 转换 :

    原来的:

    public enum NVActivityIndicatorType  {
        case Blank
        case BallPulse
        case BallGridPulse
        case BallClipRotate
        case SquareSpin
    }

    添加新的:

    @objc public enum NVActivityIndicatorType :Int{
        case Blank
        case BallPulse
        case BallGridPulse
        case BallClipRotate
        case SquareSpin
    }
    做了上面的转变后在OC中就可以使用Swift的Enum类型了

    使用方法如下:

           //NVActivityIndicatorType type  = NVActivityIndicatorTypePacman;
           //NVActivityIndicatorType type  = NVActivityIndicatorTypeBallClipRotate;
           //NVActivityIndicatorType type  = NVActivityIndicatorTypeBallScale;

    注意是NVActivityIndicatorType无缝连接 具体某个枚举的类型Pacman,变为了“NVActivityIndicatorTypePacman”


    源代码下载





    展开全文
  • 1.从Swift调用已有的Objective-C代码 在写了一些独立的Swift组件并对它们进行单元测试后,我们开始用Swift调用已有的Objective-C的类。一切都开始变得实际起来。 要从Swift调用Objective-C的类你需要定义...

    1.从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;

    2.在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
    }
    展开全文
  • (一)Swift调用Objective-C 1)已有的OC项目new file 创建swift 文件 2)出现如下所示的弹框 配置oc桥接头文件的提示 `ZhuRenWong-Bridging-Header`3)点击Create Bridging Header 4)自动生成 如下文件5)桥接文件中...

    (一)Swift调用Objective-C

    • 1)已有的OC项目new file 创建swift 文件
    • 2)出现如下所示的弹框

    配置oc桥接头文件的提示
    `LearnSwift-Bridging-Header`
    
    • 3)点击Create Bridging Header
    • 4)自动生成 如下文件
    • 5)桥接文件中添加OC的.h文件(如上图所示)

    • 6)swift 文件中调用OC 方法 如下图所示

    • 附代码:swift调用OC

        override func viewDidLoad() {
            super.viewDidLoad()
    
            self.title = "Swift Controller"
    
            // Do any additional setup after loading the view.
    
            // Utility is Objective-C function,and will be called in swift class
            // Utility 是 Objective-C 方法,可以在swift类中调用Objective-C 方法
    
            let newLabel = UILabel(frame: CGRect(x: 100, y: 100, width: 180, height: 50))
            newLabel.text = Utility.testString()
    
            self.view.addSubview(newLabel)
            self.view.backgroundColor = UIColor.white
    
        }
    

    二) OC中调用Swift 方法

    1) 配置define modules为yes 点击工程文件->TARGETS->BuildSettings->Packaging 将Defines Modules 设置为yes, Product Module Name设置为你的工程名

    setting.png

    此时,系统自动生成 “工程名-Swift.h” 这个文件,只是它不显示出来你看不见而已,这个文件不要手动创建。

    • 理解下#import "LearnSwift-Swift.h"
      其实是项目名-Swift.h,这也是Xcode自动生成的,根据你写的所有swift代码,生成一个oc的.h文件,进行类和方法的声明,这样在oc里引用这个头文件后,就相当于引用了所有swift声明,可以直接使用了。

    2) 在OC 文件中引入头文件 #import "LearnSwift-Swift.h"其中LearnSwift是项目的名称,后面的-Swift.h 是固定的写法 3) 写OC的代码 创建对象

    #import "LearnSwift-Swift.h"
    
    - (IBAction)btnClick:(id)sender {
    
        // SwiftViewController is swift class,and will be called in Objective-C class
        // Utility 是 Objective-C 方法,可以在swift类中调用
    
        SwiftViewController *controller = [[SwiftViewController alloc] init];
        [self.navigationController pushViewController:controller animated:YES];
    }
    

    如图所示

    三) 最后

    源代码Demo放在GitHub上面了(点击此处前往)。有兴趣的同学可以下载下来看看,顺便Star一下哦。

    我的微博 @云峰笔记 简书 @陈云峰 多多关注,多提意见,互相学习,互相进步!

    展开全文
  • Objective-C里调用Swift

    2016-03-22 15:00:39
    如果已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能需要采用Swift来编写,这时就可以从Objective-C调用Swift

    如果已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能需要采用Swift来编写,这时就可以从Objective-C调用Swift。

    Objective-C调用Swift时不需要桥接头文件,而是需要Xcode生成的头文件。这种文件由Xcode生成,不需要我们维护,对于开发人员也是不可见的。如下图所示,它能够将Swift中的类暴露给Objective-C,它的命名是:<工程名>-swift.h。我们需要将该头文件引入到Objective-C文件中,而且Swift中的类需要声明为@objc。

    创建Objective-C工程

    为了能够更好地介绍混合搭配调用,我们首先创建一个Objective-C工程。出于简单考虑,我们可以创建一个Mac OS X命令行工程。

    启动Xcode 6,然后单击File→New→Project菜单,在打开的Choose atemplate for your new project界面中选择“OS X→Application→Command Line Tool”工程模板(如下图所示)。

     

    接着单击“Next”按钮,随即出现如下图所示的界面。

     

    在Product Name中输入“HelloWorld”,在Language中选择Objective-C,其他的项目可以结合自己的实际情况输入内容。相关的工程选项设置完成后,单击“Next”按钮,后面的步类似。

    创建成功后的界面如下图所示,在左边的导航栏中生成了一个main.m文件。打开main.m文件,可以在右边的代码界面中看到它的代码,我们还可以在这里编写代码。

     

    在Objective-C工程中添加Swift类

    我们刚刚创建了Objective-C的工程,需要添加Swift类到工程中。具体过程是,右键选择HelloWorld组,选择菜单中的“New File…”弹出新建文件模板对话框。如下图所示,选择OS X→Source→Cocoa Class。

     

    接着单击“Next”按钮,随即出现如图下所示的界面。在Class中输入“SwiftObject”,在Language中选择Swift,其他的选项保持默认值就可以了。

     

    相关选项设置完成后,单击“Next”按钮,进入保存文件界面,根据提示选择存放文件的位置,然后单击“Create”按钮创建Swift类。如果工程中没有桥接头文件,在创建过程中,Xcode也会提示我们是否添加桥接头文件,可以选择不添加。

    调用代码

    Swift的SwiftObject创建完成后,我们会在Xcode工程中看到新增加的SwiftObject.swift文件。

    SwiftObject.swift代码如下:

     

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. import Foundation                                                               ①  
    2.    
    3. @objc class SwiftObject: NSObject {                     ②  
    4.    
    5. Func sayHello(greeting : String, withName name : String) ->String {      ③  
    6.    
    7. var string = "Hi," + name  
    8. string += greeting  
    9.    
    10. return string;  
    11.     }  
    12. }  

     

    上述代码第①行引入了Foundation框架的头文件。第②行代码定义SwiftObject类,SwiftObject类继承自NSObject类。另外,我们在类前面声明为@objc,@objc所声明的类能够被Objective-C访问,@objc还可以修饰属性。

    第③行代码定义了sayHello方法,它有两个参数,第一个参数不需要指定外部参数名,第二个参数(除了第一个以后所有的参数)需要指定外部参数名,例如withName是name参数的外部参数名。这是为了方便在Objective-C中调用。

    下面看Objective-C端的代码,main.m文件代码如下:

     

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #import <Foundation/Foundation.h>  
    2. #import "HelloWorld-swift.h"                            ①  
    3.    
    4. int main(intargc, const char * argv[]) {  
    5.    
    6. SwiftObject *sobj = [[SwiftObjectalloc] init];          ②  
    7. NSString *hello = [sobjsayHello:@"Good morning"withName:@"Tony"];        ③  
    8.    
    9. NSLog(@"%@",hello);                                                         ④  
    10.    
    11. return 0;  
    12. }  

     

     

     上述代码第①行引入头文件HelloWorld-swift.h,它是Objective-C调用Swift对象所必需的,它的命名规则是“<工程名>-swift.h”。

    第②行代码实例化SwiftObject对象,SwiftObject是Swift中定义的类。第③行代码调用SwiftObject的sayHello方法,它在Objective-C中被调用时的方法和参数命名与SwiftObject的方法和参数之间的对应关系如下图所示。

     

     

    第④行代码NSLog(@"%@",hello)用于输出结果,输出结果如下:

    2014-07-05 14:25:43.879HelloWorld[3266:303] Hi,TonyGood morning

    这样就实现了在Objective-C中调用Swift代码,我们可以借助于这样的调用充分利用已有的Swift文件,减少重复编写代码,提高工作效率。

     

     

    更多内容请关注国内第一本Swift图书《Swift开发指南》
    本书交流讨论网站:http://www.51work6.com/swift.php
    欢迎加入Swift技术讨论群:362298485
    展开全文
  • 随着现在Swift语言的崛起,很多人已经开始用Swift语言做开发了,但是由于现在很多第三方框架仍然使用object-c开发,所以这个时候Swiftobject-c混合编程显得举足轻重了。 object-c 调用 swift: 1.创建好object-...
  • Objective-C调用Swift

    2014-08-17 17:05:05
    Objective-C调用Swift如果已经有了一个老的iOS应用,它是使用Objective-C编写的,而它的一些新功能需要采用Swift来编写,这时就可以从Objective-C调用Swift。Objective-C调用Swift时不需要桥接头文件,而是需要Xcode...
  • 之前在开发是遇到了在OC文件中调用Swift对象的变量调用不到的问题,这里总结一下: 1.首先我们一个Swift项目TestProject。 2.建立一个Swift的文件继承自NSObject名字为SwiftFile.swift,并声明一个字符串变量...
  • Swift Object-c 相互调用

    2015-11-06 11:35:31
    我们先看一下Swift调用Object-c 首先我们创建一个OC类 到最后一步的时候发现多了一个确认框,点击Yes 系统会生成一个Swift和OC的转换桥梁。 他的命名规则是 项目名称-Bridging-Header.h 这个是系统生成的...
  • JavaScript调用Swift原生方法 1、创建公开给JavaScript调用的方法类 2、导入JavaScriptCore库 3、关联JSContext 4、以 JSExport 协议关联 NativeObject对象的方法 5、实现JSMethodExport协议方法 ...
  • Object-C调用Swift, 创建Swift文件,然后在需要调用Swift文件的地方加上 #import "工程名-Swift.h" Swift调用 Object-C 创建Swift文件的时候,会出现问是否要创建Bridging-header.h.当然点击Yes。 把你要引用的oc...
  • 最新一些学妹问起,所以抽点时间来写的,适合入门级别的swift 与 OC 混编 的程序猿。 本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类   1. 1 如何在swift的类中使用...
  • 1.首先创建一个代理方法继承JSExport里面实现的方法是js需要调用swift的方法@objc protocol JavaScriptSwiftDelegate: JSExport { func method(str:String) //带参数的 func method2()//不带参数 } 2.创建一个...
  • @OC调用Swift 方法 OC调用传多值参数Swift方法的处理 截止目前, Swift 已经达到4.2版本。有很多优秀的Swift库。有时需要OC和Swift混编。学习研究了一下FaceAware 人脸感知开源库。 Swift方法传多值参数及OC调用 ...
  • 1、创建一个Swift工程:ObjectCInSwift 2、创建一个Object-C的类:RoundImageView(自定义一个圆角的UIImageView)注意要选择Object-C代码 当创建完成后,Xcode提示下面警告,会提问我们需不需要创意一个Bridge,...
  • 在使用oc调用swift时,一定要看清,下面的红色部分,productName,不是类名。坑爹啊! 苹果官方文档:...
  • 1.Swift调用ObjectiveC 1.1创建OC类 //testObject.h文件 #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface testObject : NSObject -(void)seyHello; @end NS_ASSUME_NONNULL_END ...
  • Swift和ObjC互相调用

    2016-06-20 22:33:59
    Swift的设计的初衷就是摆脱ObjC沉重的历史包袱,毕竟ObjC的历史太过悠久,相比于很多现代化语言它缺少一些很酷的语法特性,而且ObjC的语法和其他语言相比差别很大。但是Apple同时也不能忽视ObjC的地位,毕竟ObjC经过...
  • Swift调用OC之NSArray

    2015-03-02 19:59:38
    // Swift调用OC之NSArray // // 1.NSArray与Array的互相转换: // 2.NSArray初始化 // 3.NSArray的常用属性和方法 //  --获取成员个数 //  --获取数组第一个元素 //  --获取数组最后一个元素 //  --...
  • 原创Blog,转载请注明出处 ...很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用。第一步创
1 2 3 4 5 ... 20
收藏数 11,178
精华内容 4,471
关键字:

object 调用swift