前言

  • iOS 中的 API 基本都是在许多年前由 OC 写成的,现在通过桥接的方法在 Swift 中可以用,基本看不出区别,非常自然。但是一些特殊的类型,在两种语言进行桥接的时候需要特别注意。

1、NSString 类型

  • NSString 是 Swift 中 String 类型在 OC 中的形式。

  • 1)Swift 1.2

    • 弱化了 StringNSString 类型的桥接,这为在 Swift 中调用 OC 代码制造了一定的困难,因为大量的 OC 方法都存在 NSString 类型的参数。
  • 2)Swift 2.0

    • StringNSString 又能亲密无间的互相传递了。
  • 3)Swift 2.2

    • 可以无缝的使用这两种类型,在需要传入 NSString 类型的地方可以直接传入 String

      func someMethod(nsstr: NSString) {
      print(nsstr)
      } let str: String = "abc"
      someMethod(nsstr: str)
    • 由于 String 是比 NSString 更高级的类型,在需要传入 String 的场合不能直接传入一个 NSString,需要借助 as 转换类型。

      func someMethod(str: String) {
      print(str)
      } let nsstr: NSString = "abc"
      someMethod(str: nsstr as String)
  • 4)Swift 3.0

    • 处理桥接的对象时,不管是 Swift 对象转 OC 对象,还是 OC 对象转 Swift 对象,都需要使用 as 关键字转化。

      func someMethod(nsstr: NSString) {
      print(nsstr)
      } let str: String = "abc"
      someMethod(nsstr: str as NSString)
      func someMethod(str: String) {
      print(str)
      } let nsstr: NSString = "abc"
      someMethod(str: nsstr as String)

2、NSArry 类型

  • NSArray 是 Swift 中 Array 类型在 OC 中的形式。

  • 1)如果 NSArray 中保存的是确定类型的元素,桥接到 Swift 中的 Array 依旧保存着 OC 类型的对象。

  • 2)如果 NSArray 没有指定类型,桥接到 Swift 中的是 AnyObject 类型的数组 Array<AnyObject>

    • 所以只要在 iOS 的 API 中看到 AnyObject 类型的数组,就说明它们以前都是 NSArray
    • 使用 Array<AnyObject> 需要使用 as? 或者 as! 转换成具体类型的数组。

3、NSDictionary 类型

  • NSDictionary 是 Swift 中 Dictionary 类型在 OC 中的形式。

  • 1)如果 NSDictionary 指定了具体的数据类型,在 Swift 中会被桥接成 OC 对象组成的 Dictionary

  • 2)如果 NSDictionary 没有指定具体的数据类型,在 Swift 中被桥接成键是 NSObject 类型、值是 AnyObject 类型的字典 Dictionary<NSObject, AnyObject>

    • 在 OC 中 NSObject 类型是所有类的基类,但是在 Swift 中没有这种类。
    • 由于 NSObject 类有一些在 iOS 中的高级特性,因此 Swift 类也可以继承自 NSObject 类。

4、基本数据类型

  • 在 Swift 中 IntFloatDoubleBool 都是从 NSNunber 桥接过来的,NSNunber 是 OC 中所有关于数值的对象。

  • IntFloatDouble 这些和 C 语言中的 intfloatdouble 也是桥接好的。

Swift 类型桥接的更多相关文章

  1. swift 类型.

    swift 类型 变量声明 用let来声明常量,用var来声明变量 可以在一行中声明多个常量或者多个变量,用逗号隔开 var x = 0.0, y = 0.0, z = 0.0 类型安全 Swift ...

  2. Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)

    一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那 ...

  3. 用Swift重写公司OC项目(Day2)--创建OC与Swift的桥接文件,进而调用OC类库

    昨天把项目中的图标以及启动转场图片弄好了,那么今天,我们可以开始慢慢进入到程序的编写当中了. 由于swift较新,所以类库还不够完善,但是不用担心,苹果早就出了解决方案,那就是使用桥接文件,通过桥接文 ...

  4. Swift类型检查与转换

    继承会发生在子类和父类中,如图所示,是一系列类的继承关系类图,Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类.这个继承关系类图的具体实现 ...

  5. Swift—类型检查与转换-备

    继承会发生在子类和父类之间,是一系列类的继承关系. 例如:Person是类层次结构中的根类,Student是Person的直接子类,Worker是Person的直接子类. 这个继承关系类的具体实现代码 ...

  6. Swift - 类型判断is 与 类型转换as

    在Swift中,通常使用is和as操作符来实现类型检查和转换.下面通过样例来演示使用方法,首先定义几个类. 1 2 3 4 5 6 7 8 9 10 11 //基类,人类 class Human{ } ...

  7. Swift类型推测在可选调用中的小提示

    我们知道Swift中协议里也有对应于Objc中的可选方法或计算属性,当然协议必须以@objc伪指令修饰否则不可以哦. 如下示例: @objc protocol Transaction{ fun com ...

  8. Swift 类型嵌套

    1.类型嵌套 Swift 支持类型嵌套,把需要嵌套的类型的定义写在被嵌套的类型的 {} 中. Swift 中的枚举类型可以辅助实现特定的类或者结构体的功能. struct SchoolUniform ...

  9. swift类型擦除的定义-swift的类型擦除只是一个类型高低阶转换的游戏。

    所谓swift的类型擦除是指: moand转换: 通过技术手段(通常是包装器),将具体类型的类型信息擦除掉了,只将类型的(某一个侧面的)抽象信息(通常指的是类型尊从的协议.接口.或基类)暴露出来. A ...

随机推荐

  1. struts2使用拦截器完成登陆显示用户信息操作和Struts2的国际化

    其实学习框架,就是为了可以很好的很快的完成我们的需求,而学习struts2只是为了替代之前用的servlet这一层,框架使开发更加简单,所以作为一个小菜鸟,特别感谢那些超级无敌变态开发的框架供我们使用 ...

  2. POJ 3190 Stall Reservations【贪心】

    POJ 3190 题意: 一些奶牛要在指定的时间内挤牛奶,而一个机器只能同时对一个奶牛工作.给你每头奶牛的指定时间的区间(闭区间),问你最小需要多少机器.思路:先按奶牛要求的时间起始点进行从小到大排序 ...

  3. Java Swing 实时刷新JTextArea,以显示不断append的内容?

    方法一: 在代码中执行完textArea.append("message")后,如果你想让这个更新立刻显示在界面上而不是等swing的主线程返回后刷新,我们一般会在该语句后调用te ...

  4. AndroidStudio 之 Inter x86 Emulator Accelerator(Haxm installer) - not compatible with windows

  5. coalesce :返回参数(列名)中第一个非NULL值的字段值

    示例 下面的语句返回值 34.(只返回一个值就算后面不为NULL也直接丢弃) SELECT COALESCE( NULL, 34, 13, 0 ) 备注 如果所有参数均为 NULL,则 COALESC ...

  6. python tkinter-菜单栏

      菜单栏 Menu f = tkinter.Menu(root) root['menu']=f f.add_command(label='菜单')# f.add_command(label='关于' ...

  7. macos 下安装virtualenv,virtualenvwrapper,然后在pycharm中正常配置方法日志

    1.安装virtualenv或virtualenvwrapper pip install virtualenv pip install virtualenvwraper 注意pip的版本号(查看 pi ...

  8. 在macOS下正确配置 VS Code 使用 virtualenv 里的 python 环境参数

    在macos配置好并启动 virtualenv 环境后,如何让 VS Code 使用这个环境下来编译调试 python 脚本呢? 1.首先当然是先配置好python虚拟环境 假定配置python的的虚 ...

  9. python+imageMagick写的一个压缩图片脚本

    !/usr/bin/python import os import cPickle as p import re import Image def imageCompre(imagedir = '.' ...

  10. luogu P4178 Tree

    题目链接 luogu P4178 Tree 题解 点分治 代码 // luogu-judger-enable-o2 #include<cstdio> #include<algorit ...