• [Swift]1.在OC项目里的OC代码调用Swift方法,Swift代码里调用OC代码。2.在Swift项目里的Swift代码里调用OC代码,OC代码调用Swift方法。
  • 之前在开发是遇到了在OC文件中调用Swift对象的变量调用不到的问题,这里总结一下: 1.首先我们一个Swift项目TestProject。 2.建立一个Swift的文件继承自NSObject名字为SwiftFile.swift,并声明一个字符串变量...

    之前在开发是遇到了在OC文件中调用Swift对象的变量调用不到的问题,这里总结一下:

    1.首先我们一个Swift项目TestProject。

    2.建立一个Swift的文件继承自NSObject名字为SwiftFile.swift,并声明一个字符串变量swiftName。

    import UIKit
    
    class SwiftFile: NSObject {
    
        var swiftName = ""
    }

    3.建立一个OC的文件ObjectFile,并导入“HFSTeacher-Swift.h”(OC想要调用Swift需要导入此文件)如何配置以及导入原因可以自行查询。

    #import "ObjectFile.h"
    #import "HFSTeacher-Swift.h"
    
    @implementation ObjectFile
    
    -(void)oneMethod
    {
        SwiftFile *swiftFile = [[SwiftFile alloc]init];
        NSLog(@"%@",swiftFile.swiftName);
    }
    
    @end

    这个时候会报错,说在SwiftFile中找不到swiftName成员。

    4.这个时候需要在SwiftFile.swift中加入一个声明@objcMembers以表示文件中成员可以被OC调用:

    import UIKit
    
    @objcMembers
    class SwiftFile: NSObject {
    
        var swiftName = ""
    }
    

    5.如此则大功告成!

    展开全文
  • 静态全局变量swiftocswift版相对比较简单 struct Example {  static var example:String = "" } oc 先写设置静态变量的方法 #import @interface staticPool : NSObject ...

    静态全局变量分swift和oc版

    swift版相对比较简单

    struct Example {

        static var example:String = ""

    }

    oc

    先写设置静态变量的方法

    #import <Foundation/Foundation.h>


    @interface staticPool : NSObject

    //静态变量的set get 方法

    +(void)setName:(NSString *)Name;

    +(NSString *)getName;


    +(void)setAge:(NSInteger)Age;

    +(NSInteger)getAge;




    @end


    #import "staticPool.h"

    //创建静态全局变量

    static NSString *name = nil;

    static  NSInteger age = 0;




    @implementation staticPool


    +(void)setName:(NSString *)Name

    {

        name = Name;

    }


    +(NSString *)getName

    {

        return name;

    }


    +(void)setAge:(NSInteger)Age

    {

        age = Age;

    }


    +(NSInteger)getAge

    {

        return  age;

    }




    @end



    然后调用设置

    #import "ViewController.h"

    #import "PageBViewController.h"

    #import "staticPool.h"


    @interface ViewController ()


    @end


    @implementation ViewController


    - (void)viewDidLoad {

        [super viewDidLoad];

        [staticPool setAge:18];

        [staticPool setName:@"Clement"];

        

        UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(50, 100, 200, 50)];

        [btn setTitle:@"跳转到获取页面" forState:UIControlStateNormal];

        [btn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];

        [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:btn];

    }



    -(void)click

    {

        PageBViewController *page = [[PageBViewController alloc]init];

        [self presentViewController:page animated:YES completion:nil];


    }


    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }


    @end



    最后在另一个页面获取

    #import "PageBViewController.h"

    #import "staticPool.h"


    @interface PageBViewController ()


    @end


    @implementation PageBViewController


    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view.

        self.view.backgroundColor = [UIColor whiteColor];

        

        UILabel *name = [[UILabel alloc]initWithFrame:CGRectMake(50, 100, 200, 35)];

        UILabel *age = [[UILabel alloc]initWithFrame:CGRectMake(50, 200, 200, 35)];

        name.textColor = [UIColor orangeColor];

        age.textColor = [UIColor orangeColor];

        [self.view addSubview:name];

        [self.view addSubview:age];

       NSString *theName =  [staticPool getName];

       NSInteger theAge =  [staticPool getAge];

        name.text = theName;

        age.text = [NSString stringWithFormat:@"%d",theAge];

    }


    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }


    /*

    #pragma mark - Navigation


    // In a storyboard-based application, you will often want to do a little preparation before navigation

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

        // Get the new view controller using [segue destinationViewController].

        // Pass the selected object to the new view controller.

    }

    */


    @end


    大工告成


    展开全文
  • OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(与你的项目配置相关,具体配置方式见上一篇文章) 2.OC类里仅可以调用public的Swift...

    原创文章转载请注明出处。

    背景


    在上一篇文章swift与OC混编(创建混编工程)中简单讲述了怎么创建Swift和OC的混编工程。本篇讲一下Swift和OC的混编工程中的方法调用。

    OC调用Swift


    OC调用Swift方法比较简单。但是需要注意以下几点:

    • 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(与你的项目配置相关,具体配置方式见上一篇文章)

    • 2.OC类里仅可以调用public的Swift方法和变量

    • 3.Swift类最好用@objc(xxx)进行描述

    暂时想到这几点,如有疏漏请留言指出,不胜感激。

    剩下的调用方式就和普通的OC之间调用方式类似了。

    OC调用Swift实例方法


    继续用上一篇文章的例子进行说明,例如在ViewController.m类里调用Swift的logMe实例方法,就可以这么写:

    SwiftDemo* demo = [[SwiftDemo alloc] init];
    [demo logMe];
    

    OC调用Swift静态方法


    首先先在SwiftDemo.swift文件中声明一个静态方法:

    public static func swiftStaticFunc(log: NSString) {
        print(log);
    }
    

    然后回到ViewController.m类里调用该方法(记得编译一下才可以吆~)

    桐乡的,调用方式和OC之间的调用类似:

    [SwiftDemo swiftStaticFunc:@"oc call swift static func"];
    

    Swift调用OC


    前一篇文中也已经说过需要有一个桥接文件Swift才可以调用OC相关方法以及属性等,这里不再赘述,忘记了的可以再回去看一下。

    Swift调用OC实例方法


    其实前面文中已经举例说明了调用方法。这里再简单重复一下。

    在SwiftDemo.swift类里调用ViewController.m类里的logYou方法,swift调用代码如下:

    let vc = ViewController()
    vc.logYou()
    

    声明一个变量vc,也就是ViewController的实例对象。然后用vc对象调用实例方法logYou。

    Swift调用OC多参方法


    首先先在ViewController.h中声明一个OC的多参方法:

    - (void) logMe:(NSString*)logMe logYou:(NSString*)logYou;
    

    在.m文件中进行一下实现:

    - (void)logMe:(NSString *)logMe logYou:(NSString *)logYou {
        NSLog(@"%@--%@", logMe, logYou);
    }
    

    在SwiftDemo.swift文件中调用方法如下:

    vc.logMe("log me", logYou: "log you")
    

    方法从第一个参数开始都要写在括号里。

    Swift调用OC静态方法


    首先先在ViewController.h中声明一个OC的静态方法:

    + (void) ocStaticFunc:(NSString*)log;
    

    然后在.m文件中简单些一下实现:

    + (void)ocStaticFunc:(NSString *)log {
        NSLog(@"%@", log);
    }
    

    回到SwiftDemo.swift文件中,用swift调用OC的静态方法。

    ViewController.ocStaticFunc("swift call oc static func")
    

    Swift调用OC变参方法


    在某些需求情景下,需要用到变参函数。简单举个例子:

    + (void) stringParams:(NSString*)params,...;
    

    这种例子在系统函数中也可以见到。比如常用的NSString的一个方法:

    - (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
    

    OC的调用方法就不再重复了。这里说一下Swift怎么调用OC的变参方法。

    首先,Swift不能直接调用OC的变参方法

    如果必须要用到,则需要对函数进行简单修改。

    拿上面刚说到的stringParams:方法举例。

    需要把方法的写法改为:

    + (void) stringParams:(NSString*)params args:(va_list)args;
    

    函数的具体实现:

    + (void) stringParams:(NSString *)params args:(va_list)args {
    
        va_list args_copy;
    
        __va_copy(args_copy,args);
        NSMutableString* format = [NSMutableString stringWithString:@""];
        while (va_arg(args, NSString*))
        {
            [format appendString:@"%@,"];
        }
        va_end(args);
    
        if(format.length>0)
            [format deleteCharactersInRange:NSMakeRange(format.length-1,1)];
    
        NSString* newFormat = [NSString stringWithFormat:@"%@",format];
        NSString * result = [[NSString alloc]initWithFormat:newFormat arguments:args_copy];
        va_end(args_copy);
        NSLog(@"%@", result);
    }
    

    在Swift中的调用方式:

    let args: [CVarArgType] = ["i'm", " showhilllee"]
        withVaList(args) {
            (pointer: CVaListPointer) in
            return ViewController.stringParams("%@,%@", args:pointer)
        }
    

    当然,还有其他方式来实现。可以尝试找一下方法。

    结语


    本文Demo可以在【这里】下载到

    —End—

    展开全文
  • 一、首先说一下调用的问题:OC->Swift(OC调用Swift) 首先配置一下环境:如图 1、Build Settings->Packaging->Defines Module 设置为 Yes 2、在修改在 build setting 中的 Product Module

    首先在项目中,为了保障工作的稳定性(工作不好找),使用混合式开发室最好的选择(前提是自己能够看得懂自己写的代码)。废话一小段…….

    一、首先说一下调用的问题:OC->Swift(OC调用Swift)
    首先配置一下环境:如图
    这里写图片描述
    1、Build Settings->Packaging->Defines Module 设置为 Yes
    2、在修改在 build setting 中的 Product Module Name (默认项目名称)即可。
    之后的项目会自动生成swift的头文件,头文件名称为Product Module Name-Swift.h
    所有的swift都会在这个头文件里,但是需要在你的需要OC调用的地方还要处理一下,见图:

    在需要OC调用的class中在加上处理的代码有标记:
    这里写图片描述

    导入需要头文件:
    这里写图片描述

    最后在需要使用的地方调用引入的class:
    这里写图片描述

    一共用到的类有:
    OCClass:SubLBXScanViewController.m
    SwiftClass:SetProjectDataInfo.swift

    二、Swift调用OC
    Swift调用OC就稍微简单了,在swift项目中新建OC文件,会提醒新建一个桥文件,当这个桥文件新建以后就可以在这个桥文件内引入想使用的OC类,这样,在Swift里面就可以使用了:下图就是我使用到的类,直接使用就ok
    这里写图片描述

    ok,到这里就结束了,剩下的和不足的以后补上。

    展开全文
  • 上篇讲了Swift中使用OCSwift中使用OC,这篇讲下OC中使用Swift类。 在OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。 特别注意 1、被使用的Swift的类必须是至少继承自NSObject...

    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中使用全局变量和函数代替宏

    展开全文
  • 最近在oc工程里要引用swiftMonkeypaws,需要使用oc调用swift技术,里面踩了很多坑,这里简单记录一下。 1、oc调用swift oc调用swift其实很简单,google一下就有很多的教程,可以参考文章1、2、3、4。总体上就是在要...
  • 随着Swift的日益完善,终究会取代OC的地位,就像Kotlin取代Java一样,不是时间的问题,而是使用者愿意不愿意被时代淘汰的问题首先是Swift中定义闭包
  • 概述 Swift的设计的初衷就是摆脱...随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以无缝结合。本文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 最近在一个混编项目中,一个OC类需要去访问一个Swift类,访问其他Swift类都可以,但就没法访问报以下错误: 点进去看发现该类型是个结构体,如下所示: 解决方案:因为Swift的结构体除了不能继承外可以有自己的成员变量和...
  • 一、OC添加pch全局引用文件 在Xcode6之前新建项目之后会自动创建这个文件。但是Xcode6以后的版本需要手动创建,创建过程如下。 1、 创建pch文件,新建一个文件,选择PCH File 2、设置pch文件的路径 为了...
  • OCswift混编中的相互跳转和传值
  • OCSwift混编

    2016-01-26 10:16:30
    Swift发展势头越来越好,而很多公司很难一下子从OC全部切换到swift,这个时候混编就显得那么的重要,本人也在逐渐的尝试混编然后逐步取代OC,从而全部转到swift上。 其实,从2014年swift刚出来的时候就开始研究swift...
  • 本文旨在帮助开发者快速从OC开发过渡到Swift开发,挑选了一些比较浅显的但是比较常用的Swift语法特性,在介绍的过程中,通常会拿OC中的语言特性作比较,让大家更好的注意到Swift的不同。 另外需要说明的是,笔者也...
  • swift 调用 OC: 1 创建工程:打开xcode 选择ios平台下的sing view application ,选择swift语言,创建工程命名为SwiftCallOC 2 添加一个基于OC的cocoa class 类,命名为继承UIImageView的QFImageView,然后会弹出一...
  • swfit和OC间的 联系 1.swift句尾不需要分号 ,除非你想在一行中写三行代码就加分号隔开。  2.swift不要写main函数 ,程序默认从上往下执行  3.swift不分.h和.m文件 ,一个类只有.swift一个文件  ...
  • swift enum 和OC兼容

    2015-07-09 16:25:22
    虽然说swift是基于OC的,但是swiftOC还是有很多去别的,今天我们来说一下枚举变量 下面是某个免费短信验证码的验证方法的返回状态 enum SMS_ResponseState { SMS_ResponseStateFail = 0, SMS_...
  • OCSwift中的static

    2016-01-22 13:00:43
    OC: static关键字表示静态,能够放在局部变量和全局变量前面: 限定作用域:对于静态全局变量来说,针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,...
  • 环境介绍: mac OS sierra 10.12.6 Xcode9(Version 9.0 (9A235)) OC的项目,项目中包含多个Target,用于实现环境分离。 目标:用Swift4.0版本版本进行普通混编开发... Swift访问OC OC访问Swift ...
1 2 3 4 5 ... 20
收藏数 4,342
精华内容 1,736