iOS中 Swift初级入门学习(三)
// // main.swift // LessonSwift-03 // // Copyright (c) 2015年 韩俊强. All rights reserved. // import Foundation // 声明一个类, 我们用class关键字修饰 // 类可以被继承, 它是引用类型 class Student { var name = "小米" var gender = "男" var age = 18 } // 创建一个student实例 let studnet = Student() let student2 = studnet // 如何判断两个实例是否一样 if studnet === student2{ println("两个实例一样, 都操作的同一块内存") }else{ println("两个实力不一样") } // 在类中,判断两个实力是否相等, 用 === ,不相等用 !== let student3 = Student() if student3 !== studnet { println("不一样") }else{ println("一样") } // 声明结构体我们用struct关键字 struct Person { var name : String var age : Int } var person = Person(name: "小妹妹", age: 19) var person2 = person // 结构体中,不能判断两个实例是否相等 //if person === person2 { // //} // 属性 // 根据调用对象的不同, 属性可以分为类属性, 还有实例类型属性 // 根据功能的不同, 属性可以分为存储属性 和 计算属性 struct Animal { // 这两个属性是对象来调用的, 是实例属性 // 这两个属性是用来存储值的, 是存储属性 var typeName : String var isFly : Bool } // 创建一个实例 var dog = Animal(typeName: "泰迪", isFly: false) // 该属性的作用是存储值, 调用的对象是实例 dog.typeName = "藏獒" println(dog.isFly) class Human { var name : String! var age : Int! // 延迟存储属性 // 延迟存储属性用lazy修饰, 而且必须是可变的, 也就是说要用var 来修饰变量, 还要给初值, 什么时候创建, 就和我们oc中的懒加载一样 lazy var cat : Animal = Animal(typeName: "波斯猫", isFly: true) } let aHumen = Human() // 调用该属性的时候, 才会被创建 aHumen.cat.typeName = "加菲猫" println(aHumen.cat.typeName) // 计算属性 class CoolPerson { var name : String! var age : Int! // 有set get方法, 或者只有get方法的属性叫做计算属性, 计算属性不能给属性赋值, 只能给其他属性赋值 var countProperty : String{ set { // newValue 就是系统在set方法中为我们提供的一个新值, 也就是我们给该属性赋的值 println(newValue) name = newValue } get { // 把值给我们的计算属性 return "\(name)" + "好帅" } } } let 小妹妹 = CoolPerson() 小妹妹.countProperty = "朱丽叶" println(小妹妹.name) println(小妹妹.countProperty) class Teacher { var name = "小花" var age = 19 // 只有get方法的属性就叫只读属性, 不能给该属性赋值 var gender : String { // get { // return "男" // } // 简洁写法 return "男" } } // 创建一个实例 let 小花 = Teacher() //小花.gender = "女" // 属性观察器 class Bird { var isFly : Bool! var age : Int! { willSet { // 属性将要被赋值的时候会走的方法 // newValue 是新值 println("newValue = \(newValue)") } didSet { // 属性已经被赋值的时候会走该方法 println("oldValue = \(oldValue)") } } } let aBird = Bird() aBird.age = 19 // 类属性 struct Desk { // 结构体中的属性我们用static修饰 // 结构体中的类属性, 我们要给它赋初始值 static var price : Float = 2 static var numbers : Int = 1 static var totalPrice : Float { set { // newValue 的类型和 totalPrice一致 numbers = Int(newValue) } get { return Float(numbers) * price } } } // 类属性通过类名调用 Desk.numbers = 10 println("总价格 == \(Desk.totalPrice) 元") // 类的类属性 class Fruit { // 类的类属性用class关键字来修饰, 并且只能修饰计算属性 class var name : String { get { return "hello" } } } println(Fruit.name) // 方法 // 按照调用对象的不同, 方法可以分为类方法和实例方法 class Plane { // 实例方法 func canFly() { println("我会飞") } } let plan = Plane() plan.canFly() struct Ship { // 实例方法 func canShip() { println("我会在水里跑") } } let ship = Ship() ship.canShip() // 类方法 struct Man { // 结构体中的类方法, 我们用static来修饰 static func playLOL() { println("男人喜欢LOL") } } // 通过 类名.方名 的方式调用类方法 Man.playLOL() // 类中的类方法我们用class来修饰, 通过 类名.方法名 的方式来调用 class Women { class func shopping() { println("败家") } } // 继承 // 没有继承类叫基类, 也叫做超类 class YaPei { var name = "亚培" var age = 23 var description : String { println("\(name) 年龄 \(age) 喜欢逛淘宝") return "\(name) 年龄 \(age) 喜欢逛淘宝" } // 如果一个类的属性或者方法不想被继承, 我们可以在方法或者属性前面加关键字 final , 如果整个类都不想被继承 就在 class前面加 关键字 final final func infoOfYaPei(){ println("这是个基类的方法"); } } class SonOfYaPei: YaPei { // 不能重写存储属性 // override var name = "小花" // 我们只能重写计算属性, 用override来修饰 override var description : String { return "\(name) 的子类" } // override func infoOfYaPei() { // println("重写了父类的方法,这是子类的方法") // } } let pei = YaPei() println(pei.description) pei.infoOfYaPei() // 构造方法 class Monkey { var name : String var gender : String var age : Int // 构造方法, 通过构造方法我们要保证每一个没有值的属性被赋值 init(name : String,age : Int,gender : String) { // 如果属性名和参数名一样, 这个时候我们的属性名前面一定要加self // 我们要确保调用过构造方法以后, 该实例的每一个属性都有值 self.name = name self.gender = gender self.age = age } } let 孙悟空 = Monkey(name: "悟空", age: 8, gender: "未知") println((孙悟空.name,孙悟空.age,孙悟空.gender)) class 金刚 : Monkey { var hobby : String // 必须在调用父类的构造方法前, 先给子类的没有赋值的属性赋值 init(name: String, age: Int, gender: String,hobby : String) { self.hobby = hobby super.init(name: name, age: age, gender: gender) } } let AC = 金刚 (name: "猴子`", age: 12, gender: "nan", hobby: "玩耍") // 析构 class BadEgg { var shape : String! var color : String! // 析构方法类似于OC里面的dealloc 方法, 当实例的引用计数器为0的时候会走的方法 deinit { println("egg --- dead") } } // 创建一个实例 var anEgg : BadEgg? = BadEgg() var anotherEgg : BadEgg? = BadEgg() anEgg = nil anotherEgg = nil // 自动引用计数机制 // 在Swift当中也是使用自动引用计数机制来管理内存(ARC) // 引用技术机制仅仅应用于类的实例, 而结构体是值类型, 有不同的方式来存储和传递值, 结构体没有引用计数机制 // Swift直接使用ARC, 会在类的实例不再使用的时候走deinit(析构)方法 // Swift中的ARC机制: 这块空间如果只是一个指针指向, 那么我们把这个指针置为nil, 这块空间就会释放掉, 如果有多个指针指向, 那么我们需要把所有的真想这块空间的指针置为nil,这块空间才会释放
每日更新关注:http://weibo.com/hanjunqiang
新浪微博
iOS中 Swift初级入门学习(三)的更多相关文章
- iOS中 Swift初级入门学习(一)
/ // Copyright (c) 2015年 韩俊强. All rights reserved. // import Foundation // Swift当中的输出函数 // println S ...
- iOS中 Swift初级入门学习(二)
// Copyright (c) 2015年 韩俊强. All rights reserved. // import Foundation /* // 控制语句 // for - in // 遍历字符 ...
- 转 iOS Core Animation 动画 入门学习(一)基础
iOS Core Animation 动画 入门学习(一)基础 reference:https://developer.apple.com/library/ios/documentation/Coco ...
- SpringCloud实战之初级入门(三)— spring cloud config搭建git配置中心
目录 1.环境介绍 2.配置中心 2.1 创建工程 2.2 修改配置文件 2.3 在github中加入配置文件 2.3 修改启动文件 3. 访问配置中心 1.环境介绍 上一篇文章中,我们介绍了如何利用 ...
- SCARA——OpenGL入门学习三
OpenGL入门学习[三] 在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处.例如:点太小,难以看清楚:直线也太细,不舒服:或者想画虚线,但不知道方法只能用 ...
- iOS Core Animation 动画 入门学习(一)基础
reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide ...
- Android M中 JNI的入门学习
今年谷歌推出了Android 6.0,作为安卓开发人员,对其学习掌握肯定是必不可少的,今天小编和大家分享的就是Android 6.0中的 JNI相关知识,这是在一个安卓教程网上看到的内容,感觉很不错, ...
- iOS之Swift语言的学习
好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...
- IOS系列swift语言之课时三
今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...
随机推荐
- 手写JAVA虚拟机(二)——实现java命令行
查看手写JAVA虚拟机系列可以进我的博客园主页查看. 我们知道,我们编译.java并运行.class文件时,需要一些java命令,如最简单的helloworld程序. 这里的程序最好不要加包名,因为加 ...
- Golang学习笔记:channel
channel channel是goroutine之间的通信机制,它可以让一个goroutine通过它给另一个goroutine发送数据,每个channel在创建的时候必须指定一个类型,指定的类型是任 ...
- Linux pip安装使用
pip安装使用详解 pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载 1 # wget " ...
- SSA-一种适合中小型企业的新型服务架构
写在前面 好久好久没写了,最近刚换了工作,花了几天的时候熟悉了项目,接着就是功能的完善,随后就是对新项目的基础架构搭建. 看过Po主博客的都知道,Po主一直致力于推广.Net Core在微服务架构上的 ...
- ionic安装教程
首先是安装node.js,通过nodejs官网下载,网址https://nodejs.org/en/.如果下载许要教程推荐这个https://www.cnblogs.com/zhouyu2017/p/ ...
- JavaScript for 循环
循环可以将代码块执行指定的次数. JavaScript 循环 如果您希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的. 我们可以这样输出数组的值: 一般写法: documen ...
- matplotlib画散点图,并在散点处打上相应标签
运行环境: py3.6 matplotlib 2.1.2 x = [2,4,6,7,8,5,4,3] y = [3,6,5,8,4,3,2,4] txt = ['我','今','晚','上','吃', ...
- Bootstrap3 栅格系统-列排序
通过使用 .col-md-push-* 和 .col-md-pull-* 类就可以很容易的改变列(column)的顺序. <div class="row"> <d ...
- Dynamics CRM2016 关于修改部署管理员账号权限引发的问题
最近在用2016做项目,一个同事的一个操作给我带来了一个头疼的问题,他把部署管理员的CRM账号的管理员权限给移除了,导致整个系统的所有账号进CRM都是下图这样 即使系统中还存在其他的拥有管理员权限的账 ...
- Android输入控件详解
输入控件 输入控件是您的应用用户界面中的交互式组件.Android 提供了多种可在 UI 中使用的控件,如按钮.文本字段.定位栏.复选框.缩放按钮.切换按钮等. 向 UI 中添加输入控件与向 XML ...