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语言之课时三
今天需要掌握的内容就是:闭包.类.结构体.属性(计算属性和延迟属性) 同样里面有一些题目,有兴趣的可以做一下. 首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量 ...
随机推荐
- 记录一次widora sdk编译ipk 实战编译redis
因为业务需求,需要用到redis存储一点简单的数据,因为redis有良好的哈希机制,可以完美实现我的某些需求,但openwrt官方提供memcached的ipk并没有提供redis,没办法,只能自 ...
- Tomcat的安装与配置
Windows安装Tomcat与启动 安装版安装 安装版长这个样子,下载到电脑上后双击开始安装 双击后出现如下页面,点击 Next> 之后是这个页面,点击 I Agree 之后出现如下页面,点击 ...
- 开发网页时,127.0.0.1或者localhost能访问,而本机地址不能访问的解决
第一 ping试试 127.0.0.1 和 本机地址 若127.0.0.1可以 说明可以自己ping自己 若本机地址可以 说明host正常 第二 检查服务器部署 再部署一个新的 若新的正常 说明你项目 ...
- return、break和continue
return.break和continue 这三个关键字有一个共同点,那就是读能让后面的语句不执行,不同的地方就是挑的距离不一样. return很强大,如果一个函数中有一个return,并且执行了,那 ...
- Java8 按照类属性去重
测试po package com.shiwulian.test.po; public class Person {private String id;private String name;priva ...
- python学习之路网络编程篇(第三篇)
python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
- d4d#9 玩Docker只要浏览器就够了,PWD是个神奇的网站
本文是d4d系列的第9篇,在这一篇中给大家介绍一个学习Docker最为快捷高效的方式,你不需要自己搭建环境,也不用担心把自己的开发环境搞乱,你需要的只是一个浏览器,就可以立即开始学习Docker的常用 ...
- Kafka生产者-向Kafka中写入数据
(1)生产者概览 (1)不同的应用场景对消息有不同的需求,即是否允许消息丢失.重复.延迟以及吞吐量的要求.不同场景对Kafka生产者的API使用和配置会有直接的影响. 例子1:信用卡事务处理系统,不允 ...
- python笔记十四(高阶函数——map/reduce、filter、sorted)
一.map/reduce 1.map() map(f,iterable),将一个iterable对象一次作用于函数f,并返回一个迭代器. >>> def f(x): #定义一个函数 ...
- JavaScript 注释
JavaScript 注释可用于提高代码的可读性. JavaScript 注释 JavaScript 不会执行注释. 我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性. 单行 ...