Swift-9-类和结构体
- // 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-类和结构体的更多相关文章
- 站在OC的基础上快速理解Swift的类与结构体
阅读此文章前,您已经有一定的Object-C语法基础了!) 2014年,Apple推出了Swift,最近开始应用到实际的项目中. 首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡 ...
- Swift 的类、结构体、枚举等的构造过程Initialization(下)
类的继承和构造过程 类里面的全部存储型属性--包含全部继承自父类的属性--都必须在构造过程中设置初始值. Swift 提供了两种类型的类构造器来确保全部类实例中存储型属性都能获得初始值,它们各自是指定 ...
- swift选择类或结构体
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体: 结构体的主要目的是用来封装少量相关简单数据值. 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用. ? 任何在结 ...
- swift 类 与 结构体
这两天突然有人问我 swift里面 类和 结构体 有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift 语言 ...
- swift 学习- 10 -- 类和结构体
// '类和结构体' 是人们构建代码所使用的一种通用且灵活的构造体, 我们可以使用完全相同的语法规则来为 '类和结构体' 定义属性 (变量 和 常量) 和添加方法, 从而扩展 类和结构体 的功能 // ...
- Swift 学习笔记 (类和结构体)
类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...
- Swift类和结构体
在C++中,相信不会有太多人去详细考究结构体和类的区别,因为二者关系实在不大.但在Swift中,结构体和类的关系非常大,它们的组成部分都包括:初始化器.实例方法.实例属性.类型属性.类型方法等等:二者 ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- swift 的枚举、结构体、类
一.Swift的枚举 枚举是一系相关联的值定义的一个公共的组类型,同时能够让你在编程的时候在类型安全的情况下去使用这些值.Swift中的枚举比OC中的枚举强大得多, 因为Swift中的枚举是一等类型, ...
- 【Swift学习】Swift编程之旅---类和结构体(十三)
与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...
随机推荐
- sdut 3-7 类的友元函数的应用
3-7 类的友元函数的应用 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握类的友元函数的定义和使用方法 要求设计一个点类Poin ...
- atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較
atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...
- java实现归并排序算法
归并排序算法思想:分而治之(divide - conquer);每个递归过程涉及三个步骤第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.第二, 治理: ...
- 利用HTML5与jQuery技术创建一个简单的自动表单完成
来源:GBin1.com 在线演示 在线下载 谷歌快速搜索自带大量自动完成插件——库中甚至还有一个附带的jQuery UI共享选项.然而今天我要寻找一个替代的解决方案.由DevBridge开发的j ...
- 一步一步学Spring.NET——1、Spring.NET环境准备
Spring.NET 1.3.2下载地址:http://down.51cto.com/data/861700 下载后解压 Spring.NET-1.3.2.7z:这个里面有我们须要用到的全部东西. S ...
- selenium获取html源代码
# 执行js得到整个HTML html = driver.execute_script("return document.documentElement.outerHTML") 获 ...
- C语言之基本算法08—去掉最高分去掉最低分求平均值
// /* ================================================================== 题目:选拔赛中通经常使用这种办法求选手分数,去掉一个最 ...
- iDempiere VS ADempiere
怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ 第三篇:iDempiere VS ADempiere 一直以来,什么谁谁谁VS谁谁谁的, ...
- 安装 Tomcat
安装 Tomcat(.exe) 而 .rar文件则只需解压即可使用. 点击 apache-tomcat-7.0.55.exe 进行安装: 在“Configuration”: Server Shutd ...
- STL容器分析--vector
vector是一种动态数组,是基本数组的类模板. vector,支持随机访问.在数据结构上,属于顺序线性表. 而且,由于是动态数组,