Swift学习笔记-005结构体和类(疯狂swift讲义第二版)
1.定义类及类相关的一切
定义类的一般语法
[修饰符] class 类名{
//类的语句
}
定义结构体的一般语法
[修饰符] class 类名{
//结构体的语句
}
定义存储属性的一般语法
[修饰符] var | let 存储属性名:类型名=初始值
定义方法的一般语法
[修饰符] func 方法名(形参列表)->返回值类型{
//方法体语句
}
定义构造器的一般语法
[修饰符] init (形参列表){
//构造器语句
}
//定义一个类
class Person{var name:String=""var age:Int=0;func say(content:String){print("let me say somthing \(content)")}
}var p1=Person()
var p2:Person
p2=Person()p1.name="zhangsan"
p1.age=23
p1.say(content: "another things")//定义一个结构体
struct Dog{var name:String!var age:Int!func say(content:String){print("let me say somthing \(content)")}
}var d1:Dog
d1=Dog(name: "bighuang", age: 2)
print(d1.name)
d1.say(content: "wangwang")
d1.say(content: "wangwang")
var d2=Dog(name: "xiaobai", age: 2)
2.使用self
class Dog{var name:String!var age:Int!func jump(){print("we are jump")}func run(){self.jump()print("we are run")}
}var d1=Dog()
d1.run()
3.使用结构体存储属性
struct FixedLengthRange{var start:Intlet length:Int
}
var rg=FixedLengthRange(start: 2, length: 10)
rg.start=5
4.延迟存储属性(懒加载)
class Dept{var id:Intvar info:Stringinit(id:Int) {self.id=id//暂停2秒,模拟耗时操作Thread.sleep(forTimeInterval: 2)//swift4.0的线程睡眠表达语法self.info="模拟读取数据库"}
}class User{var id:Int=0//var dept=Dept.init(id: 20)//不使用懒加载延迟两秒输出lazy var dept=Dept.init(id: 20)//使用懒加载后立即输出var nicks=[String]()}
print("----------")
var user=User()
user.nicks.append("孙悟空")
user.nicks.append("猪八戒")
print(user.nicks)
5.定义计算属性(get,set)
class User{var first:String=""var last:String=""var fullName:String{get{return first+last}set{var names=newValue.components(separatedBy: "-")self.first=names[0]self.last=names[1]}}init(first:String,last:String){self.first=firstself.last=last}
}let s=User(first: "孙", last: "悟空")
print(s.fullName)
s.fullName="猪-八戒"
print(s.first)
print(s.last)
打印结果
孙悟空
猪
八戒
6.方法
swift统一了函数和方法的语法格式,如果函数放在枚举、结构体、类以外定义就是函数,如果放在枚举、结构体、类之内定义就变成了方法
值类型的实例方法不能改变该实例的存储属性,如果需要让值类型的实例方法改变实例的存储属性,程序需要使用mutating将该方法声明为可变方法。
struct FKRect{var x:Intvar y:Intvar width:Intvar height:Intmutating func moveByX(x:Int,y:Int){self.x=xself.y=y}
}var rect = FKRect(x: 20, y: 12, width: 200, height: 300)
rect.moveByX(x: 100, y: 80)
print("\(rect.x)---\(rect.y )")
可变方法还可以对self直接赋值
enum Planet:Int {case Mercury=0,Venus,Earth,Mars,Jupiter,Saturn,Nepturnmutating func next(){if self.rawValue<8 && self.rawValue > -1 {self = Planet(rawValue: self.rawValue+1)!//对self直接赋值,使用期rawValue的下一个下标}}mutating func pre(){if self.rawValue<8 && self.rawValue > -1 {self = Planet(rawValue: self.rawValue-1)!}}
}var pt = Planet.Venus
pt.next()
print(pt.rawValue)
pt.pre()
print(pt.rawValue)
打印结果
2
1
7.下标
下标的一般语法为:
subscript(形参列表)->下标返回值类型{
get{
//get部分执行体,该部分必须有返回值
}
set{
//set部分执行体,该部分不一定能有返回值
}
}
下标可以重载
struct FKRect{var x:Intvar y:Intvar width:Intvar height:Int//定义一个下标subscript(idx:Int)->Int{//定义下标的get部分get{switch idx{case 0:return self.xcase 1:return self.ycase 2:return self.widthcase 3:return self.heightdefault:print("unsupporting")return 0}}//定义下标的set部分set{//省略色set部分的形参名,直接使用程序提供的隐式形参名newValueswitch idx{case 0:self.x=newValuecase 1:self.y=newValuecase 2:self.width=newValuecase 3:self.height=newValuedefault:print("unsupporting")}}}
}var rect=FKRect(x: 20, y: 12, width: 200, height: 300)
rect[0]=40
rect[1]=67
print(rect)
打印结果
FKRect(x: 40, y: 67, width: 200, height: 300)
8.下标的重载
extension String{subscript(idx:Int)->String{get{if idx > -1 && idx < self.utf16.count{return(self as NSString).substring(with: NSMakeRange(idx, 1))}else{return""}}set{self=(self as NSString).replacingCharacters(in: NSMakeRange(idx, 1), with: newValue)}}subscript(start:Int,end:Int)->String{//形参个数不一样,进行了重载get{return ""}set{}}}
9.可选链
为了能够让某种数据类型接受nil值(所有的swift类型默认不能接受nil值),需要将该类型包装成可选类型,可以有两种方法:
1、在原有类型后面添加?后缀,这种可选类型必须强制解析(使用感叹号!)才可以获取被包装的值
2、在原有类型后面加!后缀,这种可选类型可由swift隐式解析被包装的值
class Customer{var name=""var emp:Employee?init(name:String){self.name=name}
}class Employee{var name="zhansan"var title="manager"var company:Company!init(name:String,title:String) {self.name=nameself.title=title}func info(){print("the employee is \(name) and \(title)")}
}class Company{var name="fengraytech"var addr="huilongguan"init(name:String,addr:String) {self.name=nameself.addr=addr}
}var c1=Customer(name:"孙悟空")
var emp=Employee(name:"白骨精",title:"销售")
c1.emp=emp
emp.company=Company(name:"烽火科技",addr:"北京长安街")
print("my customer\(c1.name) is from \(c1.emp!.company.name)")//这里emp后面使用了强制解析的符号感叹号!//下面使用可选链的方式来引用company的name
var c2=Customer(name:"唐僧")
c2.emp=Employee(name:"白骨精",title:"销售")
print("my customer\(c2.name) is from \(c2.emp?.company?.name)")//这里emp后面使用了可选符号?,因为没有实例化company,因此要返回一个nil值
打印结果
my customer孙悟空 is from 烽火科技
my customer唐僧 is from nil
10.使用可选链调用方法
class Employee{var name="zhansan"var title="manager"init(name:String,title:String) {self.name=nameself.title=title}func info(){print("the employee is \(name) and \(title)")}func findEmp(empName:String)->Employee!{//使用隐式解析for emp in employees{if emp.name==empName{return emp}}return nil}
}let employees = [Employee(name: "白骨精", title: "销售客服"),Employee(name: "蜘蛛精", title: "售后客服"),Employee(name: "白龙马", title: "普通客服"),Employee(name: "牛魔王", title: "销售主管")
]var e1=Employee(name: "zhangsan", title: "manger")
e1.findEmp(empName: "白龙马")?.info()//使用了可选链的方式调用findEmp方法
打印结果
the employee is 白龙马 and 普通客服
11.使用可选链调用下标方法
class Employee{var name="zhansan"var title="manager"init(name:String,title:String) {self.name=nameself.title=title}func info(){print("the employee is \(name) and \(title)")}func findEmp(empName:String)->Employee!{//使用隐式解析for emp in employees{if emp.name==empName{return emp}}return nil}
}let employees = [Employee(name: "白骨精", title: "销售客服"),Employee(name: "蜘蛛精", title: "售后客服"),Employee(name: "白龙马", title: "普通客服"),Employee(name: "牛魔王", title: "销售主管")
]var dict = [Int:Employee]()
dict[1] = Employee(name: "白骨精", title: "销售客服")
dict[2] = Employee(name: "白龙马", title: "普通客服")dict[1]?.findEmp(empName: "白骨精")?.info()//使用可选链
打印结果
the employee is 白骨精 and 销售客服
Swift学习笔记-005结构体和类(疯狂swift讲义第二版)相关推荐
- c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体
枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...
- Swift 中枚举、结构体、类(enum、struct、class)
Swift 中枚举.结构体.类(enum.struct.class) Swift中的枚举与OC相比不会自动分配初始值,值的类型不会限定为整数,可以给定关联值类型和具体值(整型.浮点型.字符型(Swif ...
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法
结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...
- C语言学习笔记(15)——结构体程序设计
前言 C语言的基本数据类型有整数型.实数型及字符型,使用这些基本数据类型可以构造数组类型,并且可以定义相关数据类型的指针.本节介绍的结构体类型区别于以上任何数据类型,它还能把各种不同类型的数据组合成一 ...
- C语言学习笔记---嵌套结构体
结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体.如下面的例子: struct Date{int year;int month;int day;};struct book{char tit ...
- 结构体学习笔记6——结构体嵌套
结构体嵌套就是 在当前的结构体内的一个成员是另一个整体的结构体变量! struct Stu {char name[10];int age; }; struct Teach {char TeachNam ...
- C++学习笔记25——结构体的定义和使用,结构体数组,结构体指针
结构体 结构体的基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 结构体的定义和使用 语法:struct 结构体名 {结构体成员列表}: 通过结构体创建变量的方式有三种: stru ...
- [MATLAB学习笔记]matlab结构体A.B
在学习matlab中据见到了如下的语句: function [ seginfo ] = segment( t,acc,vel,sprate) ... seginfo.sloper=p(1); ... ...
最新文章
- 挤牙膏只服英特尔!新酷睿14nm+++,性能竟超过AMD 7nm?
- java jar 打包命令行_Java程序命令行打包Jar
- python登录接口代码_(转载)Python 的 OAuth 登录接口 python-oauth2
- C与java通讯小结
- 鼠标形状 - - -放大镜 五指小手
- 很全的路由器默认初始密码集合.txt_UpSet——集合关系可视化神器
- 4.6.2 定义内表
- System.Convert 的一些事
- jquery二级联动select
- 排序算法(四)--谢尔排序(缩小增量排序)
- Android WatchDog正解
- further occurrences of HTTP header parsing errors will be logged at DEBUG level.
- 解决Maven:Cannot resolve com.oracle.ojdbc:ojdbc6:11.2.0.1.0报红找不到问题,解决方案亲测有效详细图文教程 问题描述(ojdbc6)
- 教程 参数设置_呼吸机的使用方法教程及参数设置
- php mysql常见面试题_PHP常见面试题总结
- MyBatis入门系列(9) -MyBatis之SQL语句构建器
- exponential backoff algorithm
- Unity~ 简单的3D游戏对象动画制作
- 谷歌 汽车 android auto link,谷歌将推出Auto Link智能车载系统
- 考研数学之多元函数微积分