17.Swift学习之类
类介绍
- Swift虽然推荐面向协议编程,但其也是一门面向对象开发的语言
- 面向对象的基础是类,类产生了对象(类的实例)
- Swift中用
class
关键字定义类
定义语法
class 类名 {
// 定义属性和方法
}
- 举例
class Person {
var name = "Zhangsan"
var age = 10
var sex = "man"
func say(){
print("人会说话")
}
}
- 解读
- 定义了一个名叫 Person的类
- 这个类有三个变量存储属性和一个方法
类的实例
- 结构体一样,最简单的是在名称后面加一个
()
,但默认没有成员构造函数
var p1 = Person()
访问属性和方法
- 可以用
.
来访问一个实例的属性和方法 - 访问时如果使用了赋值语句就是设置属性
//普通构造函数
var p1 = Person()
//访问
p1.age
//设置
p1.age = 30
p1.name
p1.sex
p1.say()
类是引用类型
- 不同于值类型,引用类型被赋值到一个常量,变量或者本身被传递到一个函数的时候它是不会被拷贝的,而使用的是同一个对某个实例的引用。
var p2 = p1
p2.name = "Lisi"
p2.age = 20
p2.sex = "woman"
//对p2的修改会影响原来的p1
p1.age
p1.name
p1.sex
特征运算符
- 因为类是引用类型,可能有很多常量和变量都是引用到了同一个类的实例。有时候需要找出两个常量或者变量是否引用自同一个实例,Swift提供了两个特征运算符来检查两个常量或者变量是否引用相同的实例。
- 相同于 ( ===)
- 不同于( !==)
//特征运算符
let p3 = Person()
p1 === p2 //true
p1 === p3 //false
p1 !== p3 //true
继承
- 一个类可以从另一个类继承方法、属性和其他的特性
- 当一个类从另一个类继承的时,继承的类就是子类,被继承的就是父类
- 继承的目的是为了代码复用
Do Not Repeat Yourself
- 案例
// 定义一个父类
class Vehicle {
var currentSpeed = 0.0
func makeNoise() {
print("Ba Ba")
}
}
// 定义一个子类
class Bicycle: Vehicle {
var hasBasket = false
}
// 定义一个子类
class Car: Vehicle {
var banner = "皖B12345"
}
var vehicle = Vehicle()
vehicle.makeNoise()
let bicycle = Bicycle()
bicycle.makeNoise()
var car = Car()
car.makeNoise()
重写(覆写)
- 所谓重写就是子类可以对继承自父类实例方法、类型方法、实例属性,类型属性进行覆盖
- 重写需要在前面加上
override
关键字 - override 关键字执行时Swift 编译器会检查重写的类的父类(或者父类的父类)是否有与之匹配的声明来提供重写
class Car: Vehicle {
var banner = "皖B12345"
override func makeNoise() {
print("Di Di")
}
}
var car = Car()
car.makeNoise()
- 防止被重写
- 可以通过
final
标记阻止这种行为:final var , final func , final class func
- 可以通过
class Vehicle {
var currentSpeed = 0.0
func makeNoise() {
print("Ba Ba")
}
//不能被子类重写
final func run() {
print("Run Run")
}
}
类与结构体的对比
- 相同点
- 定义属性
- 定义方法
- 定义构造函数(init函数)
- 可以被扩展
- 遵循协议
- 类有而结构体没有的额外功能
- 继承
- 类型转换(子类 as 父类)
- 析构函数
- 引用计数
开发中类与结构体的使用场景
- 类和结构体都可以用来定义自定义的数据类型,结构体实例总是通过值来传递,而类实例总是通过引用来传递。
- 按照通用准则,当符合以下一条或多条情形时应考虑结构体,其他情况下,使用类。大部分的自定义的数据结构应该是类,而不是结构体。
- 要描述的数据类型中只有少量的简单数据类型的属性
- 要描述的数据类型在数据传递时要以复制的方式进行
- 要描述的数据类型中所有的属性在进行传递时需要以复制的方式进行
- 不需要继承另一个数据类型
- 比如:
- 定义几何形状的大小,封装了一个 width属性和 height属性,两者为 Double类型;
- 定义一定范围的路径,封装了一个 start属性和 length属性,两者为 Int类型;
- 定义三维坐标系的一个点,封装了 x , y 和 z属性,它们是 Double类型。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
java 枚举(enum) 全面解读
简介 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊类,它和普通类一样可以使用构造器、定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类. 原理分析 枚举类型使用的最常用类型就是枚举常量.下面通过一个简单的Demo来说明枚举的原理. // 定义 public enum Color { BLACK, WHITE } // 使用 public class Main { public static void main(String[] args) { System.out.println(Color.BLACK); } } // 结果 // BLACK 这样只是能够知道枚举简单的使用方法,不能看出枚举的特点和枚举的具体实现. 下面我们通过 jad工具来反编译Color类, 通过jad -sjava Color.class反编译出一份java文件. // final修饰,无法被继承 public final class Color extends Enum { // 为了避免 返回的数组修改,而引起内部values值的改变,返回的是原数组的副...
-
下一篇
16.Swift学习之结构体
结构体的介绍 概念介绍 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体是值类型 结构体既可以定义属性又可以定义方法 定义语法 struct 结构体名称 { // 属性和方法 } 举例 struct Person { var name = "Zhangsan" var age = 10 var sex = "man" func say(){ print("人会说话") } } 解读 定义了一个名叫 Person的结构体 这个结构体拥有两个存储属性 name、 age和 sex 这个结构体拥有一个方法say 结构体实例 实例化结构体最简单的是在结构体名字后面写上(),任何属性都被初始化为它们的默认值 var p1 = Person() 所有的结构体都有一个自动生成的成员构造函数来实例化结构体,可以使用它来初始化所有的成员属性 var p2= Person(name: "Lisi", age: 20, sex: "woman") 访问属性和方法 可以用.来访问一个结构体实例的属性和方法 访问时如果使用了赋值语句就是设置属性 //访问 p2.age //设置...
相关文章
文章评论
共有0条评论来说两句吧...