// Playground - noun: a place where people can play

import UIKit

// 几个重要的概念Properties/Methods/Subscripts/Initialization/Extensions/Protocols/Inheritance/Type Casting/Deinitialization/Automatic Reference Counting
// 定义语法
class someClass {
// 定义其它内容,如属性,方法,下标,初始化方法等等
} // 属性 Properties
// 存储属性
class Person {
var name : String = "Anna"
var age : Int =
} // 延迟存储属性[第一次使用时才进行初始化的属性,只能是var]
class Dog {}
class PersonContainsDog {
lazy var dog : Dog = Dog()
}
var pcd = PersonContainsDog()
//pcd.dog 调用此行代码时才会去初始化dog属性 // 计算属性
class Square {
var width : Double = 0.0
var girth : Double {
get {
return width *
} set {
width = newValue / // 和OC类似,这里set有个默认参数newValue表示即将设置的值
}
}
} var s = Square()
s.girth =
println("s width is \(s.width)") // 只读属性。对于只读计算属性,可以简写,直接return,不用写set,get关键字
class Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume : Double {
return width * height * depth
}
} // 属性监听器
class PropertyObserver {
var count : Int {
willSet {
println("willSet:\(newValue)")
} didSet {
println("didSet:\(oldValue)")
}
} init() {
count =
}
} class PropertyObserverSubclass: PropertyObserver {
override var count : Int {
willSet {
println("willSet:\(newValue)-sub")
}
}
} var p = PropertyObserverSubclass()
p.count = // 注意:1.提供了set方法时,无法再提供willSet,因为在set方法里便可以监听属性改变 2.willSet和didSet在属性初始化的过程中不会调用,只有当属性的值在初始化之外的地方被设置时才调用 // 类属性 使用class声明的
class SomeClass {
class var someClassProperty : Int {
return
}
} // 方法
// 实例方法:只能用对象实例调用的方法,也成为“对象方法” 对应OC中 “-” 开头的方法
class Counter {
var count =
func increment() {
count++
}
} var counter = Counter()
counter.increment() // 通过实例变量调用 // 方法的局部和外部参数 默认方法内的局部参数名也是外部参数名,相当于默认加 #
class CounterBy {
var count =
func incrmentBy(amount: Int, numbersOfTimes: Int) {
count += amount * numbersOfTimes
}
// 下面的写法与上面一致
// func incrmentBy(amount: Int, #numbersOfTimes: Int) {
// count += amount * numbersOfTimes
// }
// 下面的写法为第一个参数生成外部变量名, 同时取消第二个参数的默认外部参数名 因为参数是方法的一部分,所以下面的方法与第一个方法是不同的,写在一起不会报错
func incrmentBy(#amount: Int, _ numbersOfTimes: Int) {
count += amount * numbersOfTimes
} // 参数名作为方法的一部分,参数不同,方法不同. 所以此方法可以与第一个共存
func incrmentBy(amount: Int, someTimes: Int) {
count += amount * someTimes
}
} var counterBy = CounterBy()
counterBy.incrmentBy(, numbersOfTimes: )
counterBy.incrmentBy(amount: , )
counterBy.incrmentBy(, someTimes: ) // 类型方法 使用class关键字修饰,可以直接通过类型调用
class Calculator {
class func sum(num1: Int, num2: Int, num3: Int) -> Int {
return num1 + num2 + num3
}
} Calculator.sum(, num2: , num3: ) // self 同OC中self一样. 在方法内部,self表示方法调用者本身,可以是实例,也可以是类 // 附属脚本subscript
// 基本用法 基本用法同方法,可以重载
class someList {
var name = "someList"
subscript(index: Int) -> String{
return name + "\(index)"
} subscript(prefix: String) ->String{
return prefix + name
} subscript(num1: Int, num2: Int) -> Int {
return num1 + num2
}
} var somelist = someList()
somelist[]
somelist["hello, "]
somelist[, ] // 继承 inheritance 与OC基本一致
// 重写方法, 对重写的方法加override关键字
class Animal {
var age =
func run() {
println("animal-->func run")
}
} class Cat: Animal {
override func run() {
println("Dog-->override func run");
super.run()
}
}
// 重写属性 1、可以将存储属性重写为计算属性 2、可以将只读属性重写为读写属性 3、不可以将读写属性重写为只读属性
class CatForAge : Animal {
override var age: Int {
set {
super.age = newValue * // 注意不能使用self.age,会导致死循环。应调用super的set方法
} get {
return super.age * // 注意不能使用self.age 会导致死循环。应调用super的get方法
}
}
}
var cat = CatForAge()
cat.age =
cat.age // 重写属性观察 property observer 重写之后,仍会调用父类的willSet和didSet
class CatForPropertyOberver :Animal {
override var age: Int {
willSet {
println("CatForPropertyOberver-WillSet")
} didSet {
println("CatForPropertyOberver-DidSet")
}
}
}
var catFPO = CatForPropertyOberver()
catFPO.age = // 防止重写 final 使用final修饰的属性,方法,脚本无法被重写
class CatForFinal : Animal {
final var name = "final" // 子类重写该属性时会报错。方法和脚本类似
} // 构造 initialization 原则,保证所有的属性初始化完成
// 1、没有默认值的存储属性,要在初始化过程中赋值 2、初始化过程中为属性赋值不会触发属性观察器 3、便利构造方法相当于对指定构造方法的封装 4、子类的指定构造方法默认会调用父类的无参指定构造方法
class Color {
let red, green, blue: Double
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
} convenience init(black: UIColor) {
self.init(red: 255.0, green: 255.0, blue: 255.0)
}
}
var c = Color(red: , green: , blue: )
var anotherC = Color(black: UIColor.blackColor()) // 析构 和dealloc一样. 主要用来释放资源,且不可主动调用
class SomeObj {
deinit {
println("someobj dealloc or deinit")
}
}

Swift-9-类和结构体的更多相关文章

  1. 站在OC的基础上快速理解Swift的类与结构体

    阅读此文章前,您已经有一定的Object-C语法基础了!) 2014年,Apple推出了Swift,最近开始应用到实际的项目中. 首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡 ...

  2. Swift 的类、结构体、枚举等的构造过程Initialization(下)

    类的继承和构造过程 类里面的全部存储型属性--包含全部继承自父类的属性--都必须在构造过程中设置初始值. Swift 提供了两种类型的类构造器来确保全部类实例中存储型属性都能获得初始值,它们各自是指定 ...

  3. swift选择类或结构体

    按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体: 结构体的主要目的是用来封装少量相关简单数据值. 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用. ? 任何在结 ...

  4. swift 类 与 结构体

    这两天突然有人问我  swift里面 类和 结构体  有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift  语言 ...

  5. swift 学习- 10 -- 类和结构体

    // '类和结构体' 是人们构建代码所使用的一种通用且灵活的构造体, 我们可以使用完全相同的语法规则来为 '类和结构体' 定义属性 (变量 和 常量) 和添加方法, 从而扩展 类和结构体 的功能 // ...

  6. Swift 学习笔记 (类和结构体)

    类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...

  7. Swift类和结构体

    在C++中,相信不会有太多人去详细考究结构体和类的区别,因为二者关系实在不大.但在Swift中,结构体和类的关系非常大,它们的组成部分都包括:初始化器.实例方法.实例属性.类型属性.类型方法等等:二者 ...

  8. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  9. swift 的枚举、结构体、类

    一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...

  10. 【Swift学习】Swift编程之旅---类和结构体(十三)

    与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...

随机推荐

  1. .css()与.addClass()设置样式的区别

    对于样式的设置,addClass与css方法两者之间有什么区别? 可维护性: .addClass()的本质是通过定义个class类的样式规则,给元素添加一个或多个类.css方法是通过JavaScrip ...

  2. Android fragment 切换载入数据卡顿问题

    接着上一篇项目的进度.上一篇讲了怎样利用fragment来实现下拉菜单.公用菜单,以实现切换主界面数据的功能,这时候遇到的问题是:使用了fragment的切换界面方法.但载入的数据太多.用户从一个界面 ...

  3. java学习重点

    1.Java的三种体系: J2SE 用于桌面开发,低端商务开发(Java to Standard Edition) : J2ME 用于移动电话.电子消费品.嵌入式开发(Java to Micro Ed ...

  4. leetcode第一刷_Combination Sum Combination Sum II

    啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...

  5. [Mybatis - 1A] - Cause: java.sql.SQLException: Column count doesn't match value count at row 1

    严重: Servlet.service() for servlet [springMVC] in context with path [/ExceptionManageSystem] threw ex ...

  6. 关于new String(new byte[]{0})

    今天在做Zxing的二维码的时候,返回的数据竟然是这个样子,郁闷了一小会,说明我用的这个控件有改进的空间.由于时间的原因,最后还是把这个返回的字符串重新组装. Bundle bundle = data ...

  7. 【Python 数据分析】module 'numpy' has no attribute 'array'

    安装好Numpy模块后,开始做了几个小测试都可以运行,但是当我创建numpy.py这个文件后 numpy.py import numpy y = numpy.array([[11,4,2],[2,6, ...

  8. python处理xls、xlsx格式excle

    一.windows下读取xls格式文件,所需模块xlrd.xlw 1.下载安装包 xlrd地址:https://pypi.org/project/xlrd/#files xlwt地址:https:// ...

  9. 基于Netty的RPC简易实现

    代码地址如下:http://www.demodashi.com/demo/13448.html 可以给你提供思路 也可以让你学到Netty相关的知识 当然,这只是一种实现方式 需求 看下图,其实这个项 ...

  10. LaTeX 在编译时出现 File ended while scanning use of \@writefile错误

    LaTeX -在修改论文过程中,重新编译时.出现了File ended while scanning use of \@writefile错误,如以下所示: 问题出现的原因: 因为aux文件没有完整输 ...