SwiftTour基础学习(七)对象和类

  使用 class 和类名来创建一个类。类中属性的声明和常量、变量声明一样,唯一的区别就是它们的上下文是类。同样,方法和函数声明也一样。

  

class Shape {

var numberOfSides = 0

func simpleDescription() -> String {

return "A shape with \(numberOfSides) sides."

}

}

  要创建一个类的实例,在类名后面加上括号。使用点语法来访问实例的属性和方法。

  

var shape = Shape()

shape.numberOfSides = 7

var shapeDescription = shape.simpleDescription()

  这个版本的 Shape 类缺少了一些重要的东西:一个构造函数来初始化类实例。使用 init 来创建一个构造器。

class NamedShape {

var numberOfSides: Int = 0

var name: String

init(name: String) {

self.name = name

}

func simpleDescription() -> String {

return "A shape with \(numberOfSides) sides."

}

}

  注意 self 被用来区别实例变量。当你创建实例的时候,像传入函数参数一样给类传入构造器的参数。每个属性都需要赋值--无论是通过声明(就像 numberOfside)还是通过构造器(就像 name)。

  如果你需要在删除对象之前进行一些清理工作,使用 deinit 创建一个析构函数。

  子类的定义方法是在它们的类名后面加上父类的名字,用冒号分割。创建类的时候并不需要一个保准的根类,所以你可以忽略父类。

  子类如果要重写父类的方法的话,需要用 override 标记--如果没有添加 override 就重写父类方法的话编译器会报错。编译器同样会检测 override 标记的方法是否确实在父类中。

  

class Square: NamedShape {

var sideLength: Double

init(sideLength: Double, name: String) {

self.sideLength = sideLength

super.init(name: name)

numberOfSides = 4

}

func area() -> Double {

return sideLength * sideLength

}

override func simpleDescription() -> String {

return "A square with sides of length \(sideLength)."

}

}

let test = Square (sideLength: 5.2, name: "my test square")

test.area()

test.simpleDescription()

  除了储存简单的属性之外,属性可以有 getter 和 setter。

class EquilateralTriang: NamedShape {

var sideLength: Double = 0.0

init(sideLength: Double, name: String) {

self.sideLength = sideLength

super.init(name: name)

numberOfSides = 3

}

var perimeter:Double {

get {

return 3.0 * sideLength

}

set {

sideLength = newValue / 3.0

}

}

override func simpleDescription() -> String {

return "An equilateral triagle with sides of length \(sideLength)."

}

}

var triangle = EquilateralTriang (sideLength: 3.1, name: "a triangle")

print(triangle.perimeter)

triangle.perimeter = 9.9

print(triangle.sideLength)

  在 perimeter 的 setter 中,新值的名字是 newValue。你可以在 set 之后显式的设置一个名字。

  注意 EquilateralTriangle 类的构造器执行了三步:

  1.设置子类声明的属性。

  2.调用父类的构造器。

  3.改变父类定义的属性值。其他的工作比如调用方法、getters 和 setters 也可以在这个阶段完成。

  如果你不需要计算属性,但是仍然需要在设置一个新值之前或者之后运行代码,使用 willSet 和 didSet。

  比如,下面的类确保三角形的边长总是和正方形的边长相同。

  

class TriangleAndSquare {

var triangle: EquilateralTriang {

willSet {

square.sideLength = newValue.sideLength

}

}

var square:Square {

willSet {

triangle.sideLength = newValue.sideLength

}

}

init(size: Double, name: String) {

square = Square (sideLength: size, name: name)

triangle = EquilateralTriang (sideLength: size, name: name)

}

}

var triangleAndSquare = TriangleAndSquare (size: 10, name: "another test shape")

print(triangleAndSquare.square.sideLength)

print(triangleAndSquare.triangle.sideLength)

triangleAndSquare.square = Square (sideLength: 50, name: "larger square")

print(triangleAndSquare.triangle.sideLength)

  处理变量的可选值时,你可以在操作(比如方法、属性和子脚本)之前加 ?。如果 ? 之前的值是 nil,? 后面的东西都会被忽略,并且整个表达式返回 nil。否则,?之后的东西都会被运行。在这两种情况下,整个表达式的值也是一个可选值。

  

let optionalSquare: Square? = Square (sideLength: 2.5, name: "optional square")

let sideLength = optionalSquare?.sideLength

END

时间: 2024-10-11 21:45:26

SwiftTour基础学习(七)对象和类的相关文章

java基础学习——19、String类

之前的Java基础系列中讨论了Java最核心的概念,特别是面向对象的基础.在Java进阶中,我将对Java基础进行补充,并转向应用层面. 大部分编程语言都能够处理字符串(String).字符串是有序的字符集合,比如"Hello World!".在Java中,字符串被存储为String类对象.调用字符串对象的方法,可以实现字符串相关的操作. String类包含在java.lang包中.这个包会在Java启动的时候自动import,所以可以当做一个内置类(built-in class).我

JAVA基础学习day17--集合工具类-Collections

一.Collection简述 1.1.Collection与Collections的区别 Collections是集合的静态工具类 Collection:是集合的顶级接口 二.Sort 2.1.sort package com.pb.sort.demo1; import java.util.ArrayList; import java.util.Collections; /** * 对字符串进行自然排序 * */ public class SortDemo1 { public static vo

第三周学习《对象与类》心得

学习Java的第四章<对象与类>可以解决以前余留的问题,比如想求三角形,以前是直接定义变量,然后进行输出操作.学习第四章完后求三角形面积可可以运用<对象与类>知识进行编程,简便易懂.类是抽象的,而对象是具体事物,电脑是类,我们所使用的电脑的属性等就是对象.编程时遇到的问题:在写代码时只要理解类和对象的区别就可以,但在运行时总出错,比如自己写的代码和源程序没有差别,就连类名都一样,就是不能运行,而把源程序拷贝过来在运行反倒可以运行,这是怎么回事?

Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API

不同修饰符使用细节 常用来修饰类.方法.变量的修饰符 public 权限修饰符,公共访问, 类,方法,成员变量 protected 权限修饰符,受保护访问, 方法,成员变量 默认什么也不写 也是一种权限修饰符,默认访问, 类,方法,成员变量 private 权限修饰符,私有访问, 方法,成员变量 static 静态修饰符 方法,成员变量 final 最终修饰符 类,方法,成员变量,局部变量 abstract 抽象修饰符 类 ,方法 我们编写程序时,权限修饰符一般放于所有修饰符之前,不同的权限修饰

C++Primer学习笔记------对象和类(1)

一.有关类的基本知识 1.类型 仔细想想,我们通常用什么标准来判定一个数据的数据类型呢.有两个,第一个是数据的存储方式,比如char站一个自己,int占四个自己,第二个就是这种类型能够做的操作.比如整型数据可以做取余操作,但是浮点数就不可以. 所以在定义一个变量的时候,我们通常完成了下面这几件事: (1)决定要为这个类型的变量分配的内存 (2)决定如何解释内存中的位,比如在定义数组的时候,在数组的索引+1时,到底是移动几个内存单元,是根据这个数组元素的数据类型来确定的. (3)决定了这个变量所能

Hibernate基础学习(四)&mdash;对象-关系映射(上)

一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中的记录的对应关系,对象的OID和数据库表的主键对应,为了保证OID的唯一性和不可变性,应该让Hibernate,而不是应用程序来为OID赋值.     Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段.代理主键通常为整型,因为整型比字符串要节省更多数据库空间.     在

java基础学习之对象转型

对象转型(casting): 1)一个基类的引用类型变量可以指向其子类的对象 2)一个基类的引用不可以访问其子类对象新增加的成员(属性和方法) 3)可以使用引用变量instanceof类名,来判断该引用型变量所指向的对象是否属于该类或该类的子类 4)子类的对象可以当作基类的对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting) package javastudy.summary; /** * 父类Animal * @author gacl * */ class

oc学习之对象作为类的属性

对象做为类的属性 1. 一个Target中的类无法直接在另外1个Target中访问. 2. 类的属性代表什么? a. 类的属性代表这类事物具有的共同的特征 b. 类的属性代表这个类所拥有的东西. 灯: 属性: 形状 功率 价格  品牌 剩余寿命 方法: 照明. 音响: 方法: 发声音. 门: 属性: 尺寸 材料 颜色 价格 方法: 开 关 3. 类的方法代表什么? a. 代表这个类所具备的行为. 这个类所具备的功能. b. 一个类有什么方法 就去分析这个类有什么功能. 4. 属性的本质是变量.

黑马程序员--Java基础学习笔记【Object类、String类】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Object类 在Java类继承结构中,java.lang.Object类位于顶端. 所有类都直接或间接继承Object类. (接口不能继承Object类,接口中隐含定义了Object类的所有公共方法,但是全抽象) Object类型的引用变量可以指向任何类型对象. Object类成员方法 public String toString() { return getClass().getName(