Swift学习3---类和对象

1.创建和使用类

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

class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

  创建Shape类的实例,并调用其字段和方法。

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."
    }
}

注意:通过init构建对象,既可以使用self显式引用成员字段(name),也可以隐式引用(numberOfSides)。

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

2.继承和多态

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

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()

  为了简化代码,Swift引入了属性(property),见下面的perimeter字段:

class EquilateralTriangle: 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 = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength

注意:赋值器(setter)中,接收的值被自动命名为newValue。你可以在 set 之后显示的设置一个名 字。

3.willSet和didSet

  注意 EquilateralTriangle 类的构造器执行了三步:
  1. 设置子类声明的属性值
  2. 调用父类的构造器
  3. 改变父类定义的属性值。其他的工作比如调用方法、getters 和 setters 也可以在这个阶
段完成。

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

class TriangleAndSquare {
    var triangle: EquilateralTriangle {
    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 = EquilateralTriangle(sideLength: size, name: name)
    }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
triangleAndSquare.square.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLengt

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

4.调用方法

  Swift中,函数的参数名称只能在函数内部使用,但方法的参数名称除了在内部使用外还可以在外部使用(第一个参数除外),例如:

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes times: Int) {
        count += amount * times
    }
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)//注意Swift支持为方法参数取别名:在上面的代码里,numberOfTimes面向外部,times面向内部。

5.?的另一种用途

  使用可空值时,?可以出现在方法、属性或下标前面。如果?前的值为nil,那么?后面的表达式会被忽略,而原表达式直接返回nil,例如:

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional
square")
let sideLength = optionalSquare?.sideLength//当optionalSquare为nil时,sideLength属性调用会被忽略。

6.补充

初始化

  init关键词,和OC一样。不过这块非常像CPP,如下面这东西

class nyan{
        var num: Int = 1024
        init()
        {
            num = 1;
        }
    } 

    class miao:nyan
    {
        var num1: Int = 1

      override init() {

            num1 = 2
        }
    } 

var a = miao() 

println(a.num)
println(a.num1) //如果以OC的思维来看,它输出的应该是 1024, 2。因为OC只要没有call super,就是覆盖掉了。//但实际上Swift输出的是 1, 2。倘若,我们在两个init加上打log的话,会发现,子类的init先运行,然后运行父类的。那么什么时候在子类的init里面call super.init()呢?显而易见:当在子类里面要调用父类的成员变量时,要先调用super.init()去初始化它,若没有写的话,XCode会报编译错误。
时间: 2024-10-12 10:33:08

Swift学习3---类和对象的相关文章

Java学习笔记--类和对象

1.介绍面向对象的编程 面向对象是现在主流的编程样例,它替代了以前C语言使用时的"结构体",Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每个函数对于用户而言,都有特殊的功能.程序里面的很多对象都可以直接从公共库里面拿来直接用.不用去研究这些功能怎么去实现的.传统的结构的编程由一系列算法步骤来解决问题.一旦这些步骤确定下来,也要同时确定存储数据的方式.也就是数据结构一开始学习的:算法+数据结构=程序. 先决定算法,再决定使用什么样的结构来存储数

【Java学习】类、对象、实例—类是对象的抽象,对象是类的实例

类.对象.实例的关系是什么,如果不能很好的理解什么是类什么是对象就无法讲清楚, 类:某种事物与另一种事物具有相似性,比如哈士奇和泰迪,我们发现他们有一些相似的特性和行为,在生物学上,他们都属于“狗”,狗都会什么呢?他们都会叫.有四条腿等等,我们把这种具有相同属性和行为的事物就叫做类,就是我们常说的“他们是一类东西”.同时我们知道在编程语言中又数据类型这种东西,那么“类”就是一种数据类型,一种由用户定义的引用类型.并且在类中,包含属性和方法,用来描述对象的特征(比如狗一定有鼻子)和行为(比如狗一定

Java学习8——类(对象)之间的关系

(基础语法结束,开始看面向对象) 关联 关联体现的是两个类之间语义级别的一种依赖关系,比如我和我的老师. 继承(一般和特殊) 继承是指一个类继承另外一个类的的功能,并可以增加新的功能,"XX是一个AA"的语义很符合继承的含义."猴子是一种动物"可以抽象为"猴子类"继承"动物类". 聚合(整体和部分) 聚集,整体和部分是可分离的,可以具有各自的生命周期.部分可以属于多个整体的对象,也可以 为多个整体对象共享,比如球员和球队.教练

《python基础教程(第二版)》学习笔记 类和对象(第7章)

定义类class Person:    def setName(self,name):        self.name=name    def getName(self):        return self.name foo=Person()foo.setName('AAA')foo.getName()foo.namefoo.name='BBB' 私有属性,名字前面加上两个下划线.class Person:    def __setName(self,name):        self.

[swift学习之五]类练习

//------------------------// /*注意点: 1:静态函数不能继承 2:协议不和oc不一样了,虽然有optional和required关键字,但都不好使了- 3:oc协议里面的静态函数(+)能够覆盖override,swift不可以,提示为最终函数.还是swift好些,比较严谨. 4:convenience构造函数中,不能用self+.的形式把init打出来,还以为不支持呢,结果直接写也没问题.但self不能省略. 5:convenience函数不能覆盖override

学习java中对《类与对象》的认知

在学习<类与对象>章节中,我们知道了面向对象的编程语言中,类是一个独立的程序单位,是具有相同属性和方法的一组对象的集合, 在 Java 程序中,自定义类的一般格式为: class 类名 { 数据成员1 数据成员2 数据成员3 …… 成员方法1 成员方法2 } 类的说明部分由关键字 class 与类名组成,注意的是类名的命名遵循 Java 标识符的定义规则.类体是类声明中花括号所包括的全部内容,它又是由成员变量(属性)和成员方法(方法)两部分组成. 说了类,接着就是对象的剖知了,对象是把客观世界

Javascript创建类和对象

现总结一下Javascript创建类和对象的几种方法: 1.原始的创建方法: 1 <script type="text/javascript"> 2 var person = new Object(); 3 person.name="Amy"; 4 person.sex="Woman"; 5 person.show=function(){ 6 document.write("name is: "+this.name

黑马程序员— OC基本语法、类和对象、三大特性

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲     OC简介及基本语法 Objective-C简称OC是在C语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,也就是可以在OC代码中混入C语言代码,甚至是C++代码.可以使用OC开发Mac OS X平台和IOS平台的应用程序.简单的介绍了一下OC,下面我们来看看OC的基本语法,学习OC之前我们先学习了C语言,因为OC是在C语言的基础上的一门开发语言,因此OC的很多基本语法

Swift学习——A Swift Tour 对象和类

Objects and Classes  对象和类 使用关键字 class 定义一个类,在定义类的属性的时候与常量或者变量的定义相同(继承父类的属性定义不同),方法和函数的定义也相同 class Shape { var numberOfSides = 0 func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." } } 使用 ()来声明类的实例,使用点 . 语法来获取类的属

初探swift语言的学习笔记(类对象,函数)

swift扩展了很多功能和属性,有些也比较奇P.只有慢慢学习,通过经验慢慢总结了. 下面将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // Created by apple on 14-6-8. // Copyright (c) 2014年 fengsh. All rights reserved. /* 写本例子的目的在于快速学习swift类的写法,包括知识点: 1.属性设置 2.构造.释构 3.