Swift对面向对象提供了良好的支持,下面介绍几个其独有的特性。

懒加载属性

Swift在语言层面上提供了类中懒加载属性的支持,使用lazy作为关键字:

class Renderer {
lazy var loader = Loader()
var data = [String]()
var render() {
// Do something...
}
} let renderer = Renderer()
renderer.data.append("## Hello")
renderer.data.append("## Hello Again")
// loader不会被创建
renderer.loader.loadData()
// loader现在才会被创建

属性计算与属性观察器

类似于C#和Python中的@property,Swift也支持给属性赋值或者取出值时进行计算:

class Square {
var length = 0.0
var size: Double { // 必须显式声明类型
get {
return length * length
}
set (newSize) {
length = sqrt(newSize)
}
}
}

也可以用下面的方法将属性设置成只读的:

class Square {
var length = 0.0
var size: Double {
return length * length
}
}
}

除了 set 和 get ,Swift还提供了更细粒度的针对属性值变化的观察方法——属性观察器 willSet 和 didSet :

class Person {
var age: Int = 0 {
willSet(newAge) {
println("About to set new age")
}
didSet {
println("Did set new age")
}
}
}

willSet 和 didSet在每次属性赋值时都会被调用,不管新值是否与旧值相同,但是在init函数中给属性赋值时则不会被调用。

使用下标访问属性

Swift提供了subscript语法,可以使用下标来访问类的属性,类似于Python中的__getitem__

class Dict {
subscript(key: String) -> String {
get {
// 取值
} set(newValue) {
// 赋值
}
}

Convenience初始化器

Swift支持两个层次的初始化,一种叫做Designated,另一张叫做Convenience,顾名思义,是一种用于方便初始化过程的初始化器。

class Person {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "Unknown")
}
}

例如上面的代码,我们便可以使用无参数的init来快速初始化一个Person实例。

你可能要问,为什么不在原来的init里使用默认参数,而是单独再加一个初始化函数呢?我个人的理解是,当初始化参数比较多,而且类型不同时,使用默认参数会使得初始化函数变得过于复杂,而且可读性差。使用Convenicence可以把这些参数全部解耦到不同的函数里,使得代码更加漂亮。例如SwiftJSON里就大量地使用了这一特性:

public convenience init(url:String) {//...}
public convenience init(nsurl:NSURL) {//...}
public convenience init(data:NSData) {//...}

有了这些初始化函数,我们就可以很方便地使用String,URL,NSData等来构造JSON对象。

与Struct的区别

和C#之类的现代高级语言一样,Swift的结构体类型也是可以在其中定义属性和方法的,用法与类相似:

struct A{
var a = 10;
func sayHello() {
println("hello")
}
}

类和结构体的主要区别有以下几点:

  • 结构体是值类型,类是引用类型,这是最大也是最重要的区别了
  • 结构体有自动生成的成员初始化函数(Memberwise Initializer),类没有
  • 类可以使用deinit函数做反初始化,结构体不可以
  • 类支持方法继承和重载,结构体不支持

简单说来,结构体更适合用来封装若干简单的数据,例如CGRect之类。如果需要太多的逻辑和操作,还是用类更合适。

最新文章

  1. https://oj.leetcode.com/problems/majority-element/
  2. [Outlook] 重新取得outlook中被禁止访问的文件
  3. How to AC it
  4. 在ios8中做的屏幕旋转功能
  5. 【转】UnityVS(Visual Studio Tools For Unity)的安装与使用
  6. 发现木马C:\windows\system32\FastUserSwitchingCompatibilityex.dll
  7. 1009-2的N次方
  8. tomcat web.xml配置
  9. 山东理工大学ACM平台题答案关于C语言 1543 Egypt
  10. JZ2440开发笔记(9)——位置无关代码设计【转】
  11. Regular Expressions in Grep Command with 10 Examples --reference
  12. navicat导入mysql数据库sql时报错或数据不完全问题
  13. Linux shell日常命令和技巧
  14. C# 网络编程之网页简单下载实现
  15. Unity四种路径总结
  16. poj 3053 Fence Repair(优先队列)
  17. MySQL源码安装(centos)
  18. CUSTOM.PLL的使用
  19. CentOS7.5下安装、配置MySql数据库 --CentOS7.5
  20. WEBLOGIC because another WebLogic Server instance is already using this directory

热门文章

  1. android应用崩溃的调试方法(c++ lib so文件库崩溃)
  2. nginx的负载均衡和反响代理配置
  3. CentOS7.1配置远程桌面
  4. the service mysql56 was not found in the Windows services的解决办法
  5. Apache Tomcat下载、安装、配置图文教程
  6. Git教程之远程仓库(9)
  7. 【HDOJ】4122 Alice's mooncake shop
  8. Hadoop单机模式安装
  9. 1439. Battle with You-Know-Who(splay树)
  10. Android 启动过程总结