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

Objects and Classes  对象和类

使用关键字 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()

创建构造函数 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的使用,相信用过OC的都知道self.name 和 name的区别吧,当实例声明的时候,每个属性都要赋初值,可以再声明的时候赋初值(类似numberOfSides)或者在构造的时候赋初值(类似name)

使用 deinit 在对象被销毁之前做一些清理操作,同OC中的 dealloc 函数

类的继承

使用冒号 : 进行继承,任何类不需要继承标准根类,如NSObject,可以根据需要包含或者省略一个超类

使用 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 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

在 perimeter 的 set 方法中有一个没有声明的 newValue ,接收的值被自动命名为 newValue ,比如上文中的 9.9

上面的构造器中进行以下三个步骤:

1. 为子类的属性赋值

2. 调用父类的构造器

3. 修改父类中定义的属性的值

使用WillSet 和 DidSet 在 setter 一个 newValue 之前和之后执行

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.triangle.sideLength
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
triangleAndSquare.triangle.sideLength

保证了三角形和正方形的边长一样

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

class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes times: Int) {
        count += amount * times
    }
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)

上面代码中 numberOfTimes是别名,可以在外面使用

?的另外一种用途

如果实例的值为 nil ,那么所有调用这个实例的语句都不会起作用

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

下一节说枚举和结构

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

时间: 2024-10-11 02:16:47

Swift学习——A Swift Tour 对象和类的相关文章

Swift学习——A Swift Tour 函数

Functions and Closures  函数和封闭性(闭包) Functions  函数的使用 Swift中的函数定义和OC中有明显的差别了,使用func定义函数,在括号里定义參数和类型,用 -> 定义返回值类型 func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)." } greet("Bob", "Tuesda

Swift学习——A Swift Tour 枚举和结构体

Enumerations and Structures Enumerations   枚举的使用 使用 enum 定义一个枚举,枚举里面可以关联方法,比如下文中的描述方法 enum Rank: Int { case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King func simpleDescription() -> String { switch self { ca

Swift学习——A Swift Tour 协议和扩展

Protocols and Extensions Protocols  协议的使用 使用关键字 protocol 定义一个协议 protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust() } 类,枚举和结构体都可以实现协议 class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very sim

【Swift学习】Swift编程之旅---继承(十七)

在 Swift 中,继承是区分「类」与其它类型的一个基本特征.swift不支持多重继承.类可以调用和访问超类的方法,属性和subscripts下标,并且可以重写(override)这些方法,属性和附属脚本来优化或修改它们的行为.Swift 会检查你的重写定义在超类中是否有匹配的定义,以此确保你的重写行为是正确的. 可以为类中继承来的属性添加属性观察器(property observer),这样一来,当属性值改变时,类就会被通知到.可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(sto

Swift学习】Swift编程之旅---类和结构体(十三)

与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类的实例被称为对象.然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上.因此,我们会主要使用实例而不是对象. 比较类和结构体 类和结构体都具有以下特性: 定义用于存储值的属性 定义提供特定能力或功能的方法 定义提供使用下标语法访问值的下标

Swift学习笔记(10):类和结构体

目录: 基本 基本 使用class和struct关键字定义类和结构体. ?类是引用类型,结构体是值类型 ?值类型被赋予给一个变量.常量或被传递给一个函数时,已值拷贝方式传递 声明:该系列内容均来自网络或电子书籍,只做学习总结!

Swift 学习 用 swift 调用 oc

开发过程中 很可能  把swift不成熟的地方用成熟的oc 代码来弥补一下 , 下面简单来学习一下,我也是照着视频 学习的 卖弄谈不上 就是一次学习笔记, 具体问题还是具体分析吧. 需求 给展出出来的的图片 添加触摸点击响应事件 实施方式:把这个 有触摸事件的UIImageView(OFImageView) 用 OC 写成一个对象  然后用swift 去调用 1,第一次创建 OFImageView  时候 会生成一个XXXX-Bridging-Header.h 文件  查了好多资料解释说 这个

【Swift学习】Swift编程之旅---ARC(二十)

Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时,ARC会自动释放这些类的实例所占用的内存.然而,在少数情况下,为了自动的管理内存空间,ARC需要了解关于你的代码片段之间关系的更多信息.本章描述了这些情况,并向大家展示如何打开ARC来管理应用的所有内存空间. 注意:引用计数只应用在类的实例.结构体(Structure)和枚举类型是值类型,并非引用类型,不是以

【Swift学习】Swift编程之旅(三)

元组(tuples) tuples是将多个单一的值组合为一个复合的值.它可以包含任何类型的值,而不需要都是相同类型. 一.元组的创建 1. let http404error = (404,"NOT FOUND!") let (statusCode, statusMessage) = http404error print("The status code is \(statusCode),the status message is \(statusMessage)")