01-class-basic
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
/* 1.如何声明类、创建对象(不需要继承)
* 2.类是引用类型(对象赋值;不需要mutating)
* 3.object identity(对象的一致性); === !==
* 4.结构体和类的区别?
*/
/*class默认编译器不会创建构造函数
* 1.默认给初始值
* 2.添加构造函数(包含所有的属性;可选型例外)
*/
classPerson {
//存储属性
varfirstName:String//= ""
varlastName:String//= ""
varcareer:String?
//添加构造函数(包含所有)
init(firstName:String, lastName:String, career:String) {
self.firstName= firstName
self.lastName= lastName
self.career= career
}
//添加自定义的方法(修改career)
funcchangeCareer(newCareer:String) {
self.career= newCareer
}
//添加自定义的方法,返回全名
funcfullName() ->String{
returnfirstName+" "+lastName
}
}
//创建实例对象Instance
//var firstPerson = Person()
varfirstPerson =Person(firstName:"Steven", lastName:"Jobs", career:"CEO")
firstPerson.fullName()
//引用类型:Swift语言中类的对象的赋值是地址的赋值
varsecondPerson =firstPerson//地址
secondPerson.firstName="Taylor"
secondPerson.lastName="Swift"
secondPerson.career="Singer"
firstPerson.fullName()
secondPerson.fullName()
// object identity(对象的等价性):两个引用类型是否指向同一片内存空间,如果是,认为两个对象是等价的;否则,不等价
// Swift语言中,“==”用来判断值类型(数值是否相等),不能用来判断引用类型
// secondPerson == firstPerson
secondPerson===firstPerson
//创建实例对象
varthirdPerson =Person(firstName:"Taylor", lastName:"Swift", career:"Singer")
//虽然两个实例对象的值相等,但是并没有指向同一片内存空间
thirdPerson===secondPerson
thirdPerson!==secondPerson
/**结构体和类的选择问题
1.前者是值类型(copy;耗内存);后者是引用类型
2.前者内存在栈中(效率高);后者内存在堆中(相对慢)
3.前者是不能继承;后者可以继承(重用/重写)
4.前者有默认的构造函数;后者没有(手动添加)
*/
02-property
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
/* 1.存储属性:存储某个值(var/let);只可以添加到类和结构体
* 2.计算型属性(computed property):不是简单存储某个值,提供get方法和可选的set方法(也可以不实现; readonly:只读),来间接地(逻辑)获取和设置自己的值,或者设置其他存储属性的值
* 3.类型属性(type property):针对于某种类型的属性
-> Int.max Int.min
* 4.特殊:为存储属性添加属性观察器:观察该属性的值是否越界;溢出;。。。。
*/
//先声明两个结构体(存储属性),类(计算属性)
structPoint {
//存储属性
varx:Double=0.0
vary:Double=0.0
}
structSize {
//存储属性
varwidth=0.0
varheight =0.0
}
//var rectangle = Rectangle(xxxx)
//rectangle.center = Point(x: 200, y:100)
classRectangle {
//左上顶点的坐标
varorigin =Point()
//矩形的大小
varsize =Size()
//声明描述矩形中心坐标点计算型属性
varcenter:Point{
// get方法(必须实现;只实现get方法就是只读性质)
get{
//计算中心的x和y值
letcenterX =origin.x+size.width/2
letcenterY =origin.y+size.height/2
returnPoint(x: centerX, y: centerY)
}
// set方法(可选)
//首先获取要设置的值(Point结构体对象)
// newCenter局部的常量(let)
//set(newCenter) {
////已知矩形的大小,修改左顶点属性的值
//origin.x = newCenter.x - size.width/2
//origin.y = newCenter.y - size.height/2
//}
//简单的set实现; newValue:系统默认提供的要赋值的对象
set{
//已知矩形的大小,修改左顶点属性的值
origin.x= newValue.x-size.width/2
origin.y= newValue.y-size.height/2
}
}
funcgetArea() ->Double{
returnsize.width*size.height
}
//声明只读计算型属性来描述矩形的面积
vararea:Double{
get{
returnsize.width*size.height
}
}
//自定义的构造函数
init(origin:Point, size:Size) {
self.origin= origin
self.size= size
}
}
//实例化Rectangle对象
varrectangle =Rectangle(origin:Point(), size:Size(width:10, height:20))
rectangle.getArea()
rectangle.center.x
rectangle.center.y
rectangle.center=Point(x:10, y:20)
rectangle.origin.x
rectangle.origin.y
//类型属性(type property):属于某个类型(结构体/类);不属于任何一个实例对象
//需求:声明Player玩家类,包含名字存储属性+玩家分数存储属性;需要一个属性记录所有玩家的最高分数(类型属性);添加方法(记录玩家的分数)
classPlayer {
//名字
varname:String
//分数(某个实例对象)
varscore =0
//声明类型属性;记录所有玩家的最高分数
staticvarhightestScore =0
//构造函数,初始化名字
init(name:String) {
self.name= name
}
//自定义一个方法
funcplay() {
// 0 ~ 99随机整数
letscore =random()%100
print("\(name) played and got\(score) scores.")
//将之前的分数累加到该玩家的分数上
self.score+= score
print("Total score of\(name) is\(self.score)")
//将任意一个玩家的分数和最高分比较
ifself.score>Player.hightestScore {
Player.hightestScore =self.score
}
print("Highest score is\(Player.hightestScore).")
print("====================")
}
}
//实例化两个玩家
letfirstPlayer =Player(name:"Magician")
firstPlayer.play()
firstPlayer.play()
letsecondPlayer =Player(name:"Zombie")
secondPlayer.play()
secondPlayer.play()
03-property-observer
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
/*属性观察器*/
//var imUInt8:UInt8 = 2000
UInt8.max
UInt8.min
//需求:创建灯泡类,特定最大电流:20A(类型属性);声明存储属性,包含属性观察器
classLightBulb {
staticletmaxCurrent =30
varcurrent =0{
willSet{
//将要设置的时候(newValue)
print("Current value will be changed! The change is\(abs(current- newValue))")
}
didSet{
//已经设置完毕(oldValue)
print("Current value was changed and old Value is\(oldValue)")
ifcurrent>LightBulb.maxCurrent {
current=LightBulb.maxCurrent
//current = oldValue
print("New Value is\(current)")
}
}
}
}
//实例化
varlightBulb =LightBulb()
lightBulb.current=100
lightBulb.current=20
//延迟加载属性
//需求:创建闭区间类;两个存储属性,描述左区间和右区间(Int);声明属性,该属性存储整个闭区间所有整数和
/*
- (CLLocation *)userLocation {
if (_userLocaiton == nil) {
_userLocaiton = [[CLLocation alloc] init];
}
return _userLocaiton;
}
*/
classClosedRange {
letstart:Int
letend:Int
//var sum = 0
//延迟属性
lazyvarsum:Int= {
print("start computing sum value")
varresult =0
foriinself.start...self.end{
result += i
}
returnresult
}()//不要忘记()
init(start:Int, end:Int) {
self.start= start
self.end= end
//
//for i in start...end {
//sum += i
//}
}
}
//实例化
varclosedRange =ClosedRange(start:0, end:100)
closedRange.sum
closedRange.sum
closedRange.sum
04-access-control
//: Playground - noun: a place where people can play
importUIKit
varstr ="Hello, playground"
varstring:String=""
//创建App实例对象?
letapp =App(name:"Angry Bird")
app.name
app.show()
app.switchMode()
app.show()
//创建UI实例对象?无法访问,原因是Internal
//let ui = UI(
05-singleton
importFoundation
publicclassGameManager {
//声明公开的类型属性
publicstaticletdefaultManager =GameManager()
publicvarscore =0
//声明私有的构造函数
privateinit() {
//.....
}
publicfuncaddScore() {
self.score+=10
}
}
Day04
回顾:
1.枚举: 关联类型(常用)
2.结构体: 属性; 自定义构造方法;自定义方法; 可失败的构造方法; mutating关键词(修改结构体中的属性)
新内容:类
1. 面向对象的三个特点:封装、继承和多态
2. OC添加属性两个分类:存储属性(stored property)和计算属性(computed property)
.m 文件中
@interface viewControll: UIViewController {
NSString *newString;
}
@property (nonatomic, strong) NSString *string;
—> 自动会创建set/get方法;自动创建_string属性
3.样例:Swift语言中如何创建类/实例对象?
[ 01-class-basic ]
-> 创建类,可以不继承任何类
4.样例:如何添加计算型属性;类型属性; 属性观察器....
[ 02-property ]
1. 属性观察器(property observer): 对存储属性的值的变化Set做出观察和响应的反应(逻辑)
-> 观察:willSet: 在设置存储属性值之前
-> 响应:didSet:已经设置完存储属性值
2.样例:如何实现”属性观察器”机制; 延迟加载属性
[ 03-property-observer ]
3.访问控制权限(access control)
-> 对象: 结构体/类/属性/方法
-> 目的:
a. SDK(Software Development Kit:软件开发包): public(公开)
b. Framework(框架)中的h文件,能看到,public/internal
-> 三种访问权限:
a. private:私有;限定到某个文件xxxx.swift
b. internal:内部(缺省Default权限); 限定到某个Module(模块); App bundle(Module); Framework(Module)
c. public:公开的;几乎没有限定
4.样例:创建两个类,设置不同的访问权限;
[ 04-access-control ]
-> playground: Module/File
5.单例Singleton:一种设计模式,某个类只创建一个实例对象Instance
[UIApplicationsharedApplication]
[NSFileManagerdefaultManager]
[NSUserDefaultstanstardUserDefault]
—> OC中创建单例对象的方法
a. 常用的使用static创建-> 线程不安全
b. GCD中dispatch_once一次性任务 -> 线程安全
c. 加锁 synchronize
d. 实现initialization方法实现
6.样例:如何创建单例对象;
[ 05-singleton ]
-> init构造函数(private);
-> 声明属性(let)
Day04知识点:
—> 类声明/创建相关:
1.声明:使用class关键词,添加自定义构造函数;添加自定义方法;
2.创建:使用自定义构造函数创建类的实例对象
3.类对象的等价性:使用===或者!==来判定两个引用类型是否等价; 如果两个引用类型指向内存中同一片内存空间,表示等价,即===返回true; 否则返回false
—> 属性相关:
1. 存储属性(stored property): var/let修饰,存储某个值
-> 添加属性观察器(property observer):willSet/didSet
2. 计算属性(computed property): get/set两个方法,去获取/设置属性(自己/其它属性)
3. 类型属性(type property):static修饰
4. 延迟加载属性(lazy property): 和OC中的懒加载思路一致
—>场景:
a. 当某个属性(延迟属性)的初始化依赖于其它的属性初始化
b. 当某个属性(延迟属性)的计算耗时(占用资源), 不应该在类的初始化阶段计算
->描述:在类的初始化阶段,不赋值;直到使用/创建的时候才赋值;只赋值一次
->语法:关键词lazy;
—> 访问权限(access control)相关
1. 一般原则:统统先设定为private(结构体/类/属性/方法),限定到某个文件内部可见;希望暴露哪个属性/方法,再设置为public
—> 创建单例:
1.语法:
a. 将init构造函数设置为private权限,init方法的调用限定在文件内部
b. 声明公开的类型属性(static),使用let修饰,保证只可以初始化一次
2.样例如下:
publicclassGameManager {
//声明公开的类型属性
publicstaticletdefaultManager =GameManager()
publicvarscore =0
//声明私有的构造函数
privateinit() {
//.....
}
publicfuncaddScore() {
self.score+=10
}
}
网友评论