博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Using Swift with Cocoa and Objective-C》总结
阅读量:6800 次
发布时间:2019-06-26

本文共 5217 字,大约阅读时间需要 17 分钟。

hot3.png

 互用性

1>与Objective-C API交互

1.初始化

  1)在OC中,初始化往往会有init、initWith字眼,但在swif却在这里都省略了,连分配内存的alloc,swift也会自动帮我们处理。

//Objective-CUITableView *myTableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];									//Swiftlet myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

  2)在初始化的时候,我们甚至可以忽略对象类型。

let myTextField = UITextField(frame: CGRect(x: 50, y: 50, width: 200, height: 39))

 3)关键字convenience

       这类方法是Swift初始化方法中的“二等公民”,只作为补充和提供使用上的方便。所有的convenience初始化方法都必须调用同一个类中的designated初始化完成设置,另外convenience的初始化方法是不能被子类重写或从子类中以super的方式被调用的。虽然不能重写,但可以子类也可以调用

class ClassA {      let numA: Int      init(num: Int) {          numA = num      }      convenience init(bigNum: Bool) {          self.init(num: bigNum ? 10000 : 1)   //补充init(num: Int)初始化方法。    }  }class ClassB: ClassA {      let numB: Int      override init(num: Int) {          numB = num + 1          super.init(num: num)      }  }let anObj = ClassB(bigNum: true)  // anObj.numA = 10000, anObj.numB = 10001 //虽然不能重写,但可以子类也可以调用

2.方法

 1)OC的selector部分,第一个参数名作为方法名,然后再括号,括号后的第一个参数名会省略,后面的参数不变

//Objective-C[myTableView insertSubview:mySubview atIndex:2];        //SwiftmyTableView.insertSubview(mySubview, atIndex: 2

2)无参数的方法,仍然必须在方法名后加括号

//SwiftmyTableView.layoutIfNeeded()

3.id/AnyObject

        Swift 包含一个叫做AnyObject的协议类型,表示任意类型的对象,就像 Objective-C 中的id一样。

   1)跟 id 一样,你可以为AnyObject类型的对象分配任何其他类型的对象,你也同样可以为它重新分配其他类型的对象。

var myObject:AnyObject = UITableViewCell()myObject = NSDate()

   2)配合optional类型使用

//Swiftlet futureDate = myObject.dateByAddingTimeInterval(10)let timeSinceNow = myObject.timeIntervalSinceNowmyObject.characterAtIndex(5)因为NSDate无characterAtIndex这个方法,所以会报错。但我们可以添加为characterAtIndex属性添加?。当myObject.characterAtIndex(5)不存在或无值的时候,程序不会奔溃,而会返回nil值。

4)强制转换 as!/as?

    as?   对于 Swift 中的强制类型转换,从 AnyObject 类型的对象转换成明确的类型并不会保证成功,所以它会返回一个可选的值。而你需通过检查该值的类型来确认转换是否成功。

   as!  如果你能确定这个对象的类型(并且确定不是 nil)

let userDefaults = NSUserDefaults.standardUserDefaults()let lastRefreshDate: AnyObject? = userDefaults.objectForKey("LastRefreshDate")if let date = lastRefreshDate as? NSDate {     print("\(date.timeIntervalSinceReferenceDate)")}                let myDate = lastRefreshDate as! NSDate    //Error:lastRefreshDate is nillet timeInterval = myDate.timeIntervalSinceReferenceDate

5)使用nil

  在 Objective-C 中,对象的引用可以是值为 NULL 的原始指针(同样也是 Objective- C 中的 nil)。而在 Swift 中,所有的值–包括结构体与对象的引用–都被保证为非空。而且OC是无法判断该值是否为nil,当在某些情景下,当nil的时候程序会奔溃。而swift中有optional类型,当我们使用optional的时候,对象或者属性可以判断是否为空。如果不存在,将会返回nil,而不会奔溃

6)比较对象

  当比较两个 Swift 中的对象时,可以使用两种方式。第一种,使用(==),判断 两个对象内容是否相同。第二种,使用(===),判断常量或者变量是否为同一个对 象的实例。

7)Objective-C与Swift混编

  1)Swift类继承Objective-C类,系统会自动处理

  2)Swift类或Objective-C类想调用对方的类或属性、方法,对应的类、属性和方法加上@objc既可

  具体可以百度混编

8)Selectors选择权

    在 Swift 时代, Objective-C 的选择器被Selector结构体替代。你可以通过字符串创建一个选择 器

比如 let mySelector: Selector = "tappedButton:"。因为字符串能够自动转换为选择器,所以你可以把字符串直接传递给接受选择器的方法。    //Swift    import UIKit    class MyViewController: UIViewController {        let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))        init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {            super.init(nibName: nibName, bundle: nibBundle)        myButton.targetForAction("tappedButton:", withSender: self)//传入方法名的字符串类型        }                func tappedButton(sender: UIButton!) {        println("tapped button")        }    }

1.2>使用Objecitve-C特性编写Swift类

1.继承Objective-C的类和使用协议

都是跟在父类的冒号:后面

class MySwiftViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {						// 定义类} 

2.编写构造器和析构器

1)Swift 的编译器确保在初始化时,构造器不允许类里有任何未初始化的属性

 2)Objective-C 语言不同,Swift 不 提供单独的内存分配方法供开发者调用

 3)Swift 会将 Objective-C 的初始化方法转换为 Swift 的初始化方法。

 4)执行额外的清理工作时,执行一个析构过程来代 替dealloc方法。

5)继承Objective-C类的Swift类会自动加载父类的delloc方法

3.属性特性

1)强类型和弱类型 Swift里属性默认都是强类型。weak关键字修饰弱类型,该关键字只能修饰optional类型

2) 读/写和只读    Swift中,没有readonly和readwrite特性。当声明一个存储型属性时,使用let修饰为只读,var为读/写。当声明一个计算型属性时,只提供getter为只读,提供setter和getter方法为读/写

3)copy特性被转换为@NSCopying属性。必须遵守NSCopying协议

1.3>采用Cocoa设计模式

1.委托

    与 Objective-C 相比,当你在 Swift 中继承一个委托时,虽然继承模式不变,但是内部的实现已经改变了。在 Objective-C 中,在你向委托发送消息之前,不管它是不是 nil 你都会去查看,如果定义的方法是非必须实现的 方法,不管委托有没有实现这个方法,你也都会去查看。而在 Swift 中,通过保持类型安全的特性,而且访问特定的方法。

 Objective-C  @inteface MyObject : NSObject  property (nonatomic, weak) id
 delegate;  @end  swift if let fullScreenSize = myDelegate?.window?(myWindow, willUseFullScreenContentSize:     mySize) {     println(NSStringFromSize(fullScreenSize)) }

2.延迟初始化

3.错误报告

4.键值观察

5.Taget-Action模式

   在选择器已说明

6.类型匹配与同一规范

     在 Objective-C 中,你可以使用 isKindOfClass: 方法检查某个对象是否是指定类 型,可以使用 conformsToProtocol: 方法检查某个对象是否遵循特定协议的规范。在 Swift 中,你可以使用 is 运算符完成上述的功能,或者也可以使用 as? 向下匹配 指定类型。   

//使用 is 运算符检查一个实例是否是指定的子类。if object is UIButton {    // object is of type UIButton					} else {    // object is not of type UIButton					}//使用 as? 向下匹配指定类型。let myButton = object as? UIButton {    // object is successfully cast to type UIButton and bound to button					} else {    // object could not be cast to type UIButton					} //检查匹配协议的语法与检查匹配类的语法是一样的,下面是使用as?检查匹配协议			if let dataSource = object as? UITableViewDataSource {// object conforms to UITableViewDataSource and is bound to dataSource		} else {    // object not conform to UITableViewDataSource					} 			 

转载于:https://my.oschina.net/u/2346786/blog/523624

你可能感兴趣的文章
(转)IC验证概述
查看>>
[bzoj1924] 所驼门王的宝藏
查看>>
form表单属性及表单分组
查看>>
<dxwgv:ASPxGridView
查看>>
小程序中通过判断id来删除数据,当数据长度为0时,显示隐藏部分(交流QQ群:604788754)...
查看>>
php把数据转换为json格式
查看>>
Java线程(学习整理)--2---加入另一个线程join
查看>>
replace into 浅析之一
查看>>
软件工程15 个人阅读作业2—提出问题
查看>>
Windows Azure Traffic Manager的新的管理API
查看>>
1.5站立会议之个人
查看>>
remote机制的AdditionalFields
查看>>
MySQL 常用内置函数与所有内置函数
查看>>
bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)
查看>>
Mybatis学习(4)输入映射、输出映射、动态sql
查看>>
java设计模式-策略模式
查看>>
iOS随笔记录
查看>>
objective-c面向对象
查看>>
Windows 7下Git SSH 创建Key【待解决?】
查看>>
阿里云服务器Linux CentOS安装配置(七)域名解析
查看>>