类
- 与结构体异同
/*相同点:
1.定义属性用于存储值
2.定义方法用于提供功能
3.定义附属脚本用于访问值
4.定义构造器用于生成初始化值
5.通过扩展以增加默认实现的功能
6.符合协议以对某类提供标准功能
*/
/*与结构体相比,类还有如下的附加功能
1.继承允许一个类继承另一个类的特征
2.类型转换允许在运行时检查和解释一个类实例的类型
3.解构器允许一个类实例释放任何其所被分配的资源
4.引用计数允许对一个类的多次引用
*/
- 类的定义
class student {
}
- 恒等运算符
1.运算符为:===
如果两个常量或者变量引用同一个类实例则返回 true
2.运算符为:!==
如果两个常量或者变量引用不同一个类实例则返回 true
结构体
/*Swift 结构体是构建代码所用的一种通用且灵活的构造体。我们可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能。
与 C 和 Objective C 不同的是:
1.结构体不需要包含实现文件和接口。
2.结构体允许我们创建一个单一文件,且系统会自动生成面向其它代码的外部接口。
*/
///结构体定义
/*
struct StudentS {///Swift编译器自动为这个struct创建了一个初始化方法,这种init方法叫做Memberwise initializer
var name: Int
var age: Int
}
调用
let st = StudentS(name: 1, age: 2)
print(st.name)
如果有默认值 不用指定参数来初始化StudentS对象了
*/
/*结构体应用
在你的代码中,你可以使用结构体来定义你的自定义数据类型。
结构体实例总是通过值传递来定义你的自定义数据类型。
Bool,Int,Double,String,Array,Dictionary等常见类型都是结构体
结构体是值类型
*/
/*1.值类型
var a = 10
let b = a
a += 1
print(a,b)//11 10 a和b是指向不同的内存空间,并且直接将值存入其中,所以修改了其中一方并不影响另一方。 结论 值类型的特征:在变量的背后,值直接保存在变量指向的内存位置。
//2.引用类型
class Student {
var name: String = 18
}
var s = Person()
var s1 = s
s1.name = "10"
s和s1指向同一个内存地址
*/
extension
- 定义
/*extension
1.定义
扩展就是向一个已有的类、结构体或枚举类型添加新功能。
扩展可以对一个类型添加新的功能,但是不能重写已有的功能。
2.添加计算型属性和计算型静态属性、定义实例方法和类型方法、提供新的构造器、定义下标、定义和使用新的嵌套类型、使一个已有类型符合某个协议
3.extension Type {
// 加到SomeType的新功能写到这里
}
*/
- 举例
extension ViewController{
func add() {
print("666666666")
}
}
extension Int
{
var add : Int {
return self+1
}
}
extension Double {//结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样。
mutating func square() {
let per = 3.14
self = per * self * self
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//扩展
self.add()
let b = 5.add
print(b)
var a = 3.9
a.square()
print(a)//圆的面积
}
}
协议
/*
协议能够继承一个或多个其他协议,可以在继承的协议基础上增加新的内容要求。
协议的继承语法与类的继承相似,多个被继承的协议间用逗号分隔:
协议规定了用来实现某一特定功能所必需的方法和属性。
类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。
写法:
protocol LifeServiceHeadClickDelegate: NSObjectProtocol {
func clickWithIndex(index:Int)
}
protocol HomePlayDelegate {
// 协议内容 属性必须指明是只读的还是可读可写的。
var age: Int { get set }//set 写 get 读
var name : String {get}//只读
}
要使类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔
class ViewController: UIViewController ,LifeServiceHeadClickDelegate{}
//可以在协议的继承列表中,通过添加class关键字,限制协议只能适配到类(class)类型。
protocol changeColor : UIView {
}
*/
Swift泛型
/*
Swift 的数组和字典类型都是泛型集。
可以创建一个Int数组,也可创建一个String数组,或者甚至于可以是任何其他 Swift 的类型数据数组。
泛型是为Swift编程灵活性的一种语法,在函数、枚举、结构体、类中都得到充分的应用,它的引入可以起到占位符的作用,当类型暂时不确定的,只有等到调用函数时才能确定具体类型的时候可以引入泛型。
使用
// 定义一个泛型函数,把2个参数的值进行交换
func swapTwoValues<T>( first:inout T , second:inout T) {
let temporary = first
first = second
second = temporary
}
*/
懒加载
private lazy var lineView : UIView = {
let lineView = UIView()
lineView.backgroundColor = UIColor(hexStr: "#EEEEEE")
return lineView
}()
构造函数
//构造函数
/*1.定义
与 Objective-C 中的构造器不同,Swift 的构造器无需返回值,它们的主要任务是保证新实例在第一次使用前完成正确的初始化。
类实例也可以通过定义析构器(deinitializer)在类实例释放之前执行清理内存的工作。
init(<#parameters#>) {
<#statements#>
}
2.Swift 中的子类不会默认继承父类的构造器。
父类的构造器仅在确定和安全的情况下被继承。
当你重写一个父类指定构造器时,你需要写override修饰符。
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {}
override init(frame:CGRect){}
*/
继承、重写
1.继承
继承我们可以理解为一个类获取了另外一个类的方法和属性。
2.重写 override
子类可以通过继承来的实例方法,类方法,实例属性,或下标脚本来实现自己的定制功能,我们把这种行为叫重写(overriding)。
我们可以使用 override 关键字来实现重写。
子类中我们可以使用 override 关键字来重写超类的方法。
override func paly(){
//paly 来自superclass
}
我们可以使用 final 关键字防止它们被重写。
如果你重写了final方法,属性或下标脚本,在编译时会报错