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讲义第二版)相关推荐

  1. c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  2. Swift 中枚举、结构体、类(enum、struct、class)

    Swift 中枚举.结构体.类(enum.struct.class) Swift中的枚举与OC相比不会自动分配初始值,值的类型不会限定为整数,可以给定关联值类型和具体值(整型.浮点型.字符型(Swif ...

  3. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  4. C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  5. C语言学习笔记(15)——结构体程序设计

    前言 C语言的基本数据类型有整数型.实数型及字符型,使用这些基本数据类型可以构造数组类型,并且可以定义相关数据类型的指针.本节介绍的结构体类型区别于以上任何数据类型,它还能把各种不同类型的数据组合成一 ...

  6. C语言学习笔记---嵌套结构体

      结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体.如下面的例子: struct Date{int year;int month;int day;};struct book{char tit ...

  7. 结构体学习笔记6——结构体嵌套

    结构体嵌套就是 在当前的结构体内的一个成员是另一个整体的结构体变量! struct Stu {char name[10];int age; }; struct Teach {char TeachNam ...

  8. C++学习笔记25——结构体的定义和使用,结构体数组,结构体指针

    结构体 结构体的基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 结构体的定义和使用 语法:struct 结构体名 {结构体成员列表}: 通过结构体创建变量的方式有三种: stru ...

  9. [MATLAB学习笔记]matlab结构体A.B

    在学习matlab中据见到了如下的语句: function [ seginfo ] = segment( t,acc,vel,sprate) ... seginfo.sloper=p(1); ... ...

最新文章

  1. 挤牙膏只服英特尔!新酷睿14nm+++,性能竟超过AMD 7nm?
  2. java jar 打包命令行_Java程序命令行打包Jar
  3. python登录接口代码_(转载)Python 的 OAuth 登录接口 python-oauth2
  4. C与java通讯小结
  5. 鼠标形状 - - -放大镜 五指小手
  6. 很全的路由器默认初始密码集合.txt_UpSet——集合关系可视化神器
  7. 4.6.2 定义内表
  8. System.Convert 的一些事
  9. jquery二级联动select
  10. 排序算法(四)--谢尔排序(缩小增量排序)
  11. Android WatchDog正解
  12. further occurrences of HTTP header parsing errors will be logged at DEBUG level.
  13. 解决Maven:Cannot resolve com.oracle.ojdbc:ojdbc6:11.2.0.1.0报红找不到问题,解决方案亲测有效详细图文教程 问题描述(ojdbc6)
  14. 教程 参数设置_呼吸机的使用方法教程及参数设置
  15. php mysql常见面试题_PHP常见面试题总结
  16. MyBatis入门系列(9) -MyBatis之SQL语句构建器
  17. exponential backoff algorithm
  18. Unity~ 简单的3D游戏对象动画制作
  19. 谷歌 汽车 android auto link,谷歌将推出Auto Link智能车载系统
  20. 考研数学之多元函数微积分

热门文章

  1. rocketmq发送消息失败
  2. web服务器安装与基本操作(apache)
  3. ASP.Net基本控件之TextBox控件
  4. 2022年好用的蓝牙耳机有哪些?2022年蓝牙耳机推荐
  5. Mutex互斥体 学习
  6. android 更换皮肤项目
  7. 工程经济学 2 资金的时间价值与资金的等值计算
  8. SurfaceFlinger草稿
  9. android手机短信验证码读取问题
  10. php 箭头符号怎么打开,php箭头的用法是什么?