美文网首页
iOS-swift4学习(类和结构体)

iOS-swift4学习(类和结构体)

作者: 木马不在转 | 来源:发表于2018-07-17 11:04 被阅读184次
  1. 类和结构体示列
struct Resolution {
    
    var waith:Double
    var height:Double

   /* volume 创建只读属性 可以去掉 get 关键字和花括号 */
    var volume: Double {
        
        return waith*height
    }
}

class VideoMode {
    /* lazy:延迟存储属性 只有在第一次被访问的时候才被创建*/
    lazy var resolution = Resolution(waith: 0.0, height: 0.0)
    var interlaced = false
    var frameRate: Int = 10
    /* static 无论创建了多少个该类型的实例,这些属性都只有唯一一份*/
    static var name: String?
    /* sizeMax 是计算属性*/
    var sizeMax: Int {
        get{
            return frameRate*2
        }
        set(newSizeMax){
            frameRate = newSizeMax/2
        }
    }
    
}

let someResolution = Resolution(waith: 0.0, height: 0.0)
let someVideoMode = VideoMode()
  1. 属性观察器
  • willSet 在新的值被设置之前调用
    观察器会将新的属性值作为常量参数传入,在 willSet 的实现代码中可以为这个参数指定一个名称,如果不指定则参数仍然可用,这时使用默认名称 newValue 表示。
  • didSet 在新的值被设置之后立即调用
    观察器会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名 oldValue。如果在 didSet 方法中再次对该属性赋值,那么新值会覆盖旧的值。
class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
  1. 在实例方法中修改值类型 - mutating
  • 结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改。
struct UPoint {
    var x = 0.0, y = 0.0
    mutating func moveByX(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
      // self = UPoint(x: x + deltaX, y: y + deltaY)  结果同上
    }
}

var someUPoint = UPoint(x: 1.0, y: 1.0)
someUPoint.moveByX(x: 2.0, y: 3.0)
print("The point is now at (\(someUPoint.x), \(someUPoint.y))")
// 打印 "The point is now at (3.0, 4.0)"
  1. 实例方法(-号方法)和类型方法 (+号方法)
  • 实例方法
class Counter {
    var count = 0
    func increment() {
        count += 1
    }
}
let counter = Counter() 
counter.increment() 
  • 类型方法
class Square {
    // 类型属性,用class关键字
    class var PI: Double{
        return 3.14
    }
  /* 1. 在类中,需要注意的是,存储属性不能使用class进行修饰,用static就可以了
     2. 协议和结构体的类型也用static修饰 */
    static var phone: String?
}
print(Square.PI) 
  1. 下标语法 - subscript
struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])") // 打印 "six times three is 18"
  1. 继承
class Vehicle {
    var currentSpeed = 0.0
    // final 防止重写修饰
    final var name:String?
    func makeNoise() {
    }
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
}

class SomeClass: Vehicle {
    
    var gear = 1
     // 重写父类方法 override修饰
    override func makeNoise() {
        // 访问父类方法实现
        super.makeNoise()
    }
    // 重写属性
    override var description: String {
      
        return super.description + " in gear \(gear)"
    }
    // 重写属性观察器
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10.0) + 1
        }
    }
}
  1. 构造方法
class AgeClass{
}
class Food {
    var name: String
    /* unowned 无主引用不会牢牢保持住引用的实例 当AgeClass销毁时Food也会自行销毁*/
    unowned let age: AgeClass
    
    /* 可选属性不需要在构造函数里赋值 */
    var response: String?
    
    /* weak 弱引用不会对其引用的实例保持强引用 */
    weak var ageData: AgeClass?
    
    /* required修饰的构造器 表明所有该类的子类都必须实现该构造器,且子类也要加required修饰而不需要添加override修饰符 */
    required init(name: String, age:AgeClass) {
        self.name = name
        self.age = age;
    }
    
    /*  便利构造器  */
    convenience init() {
        self.init(name: "[Unnamed]",age:AgeClass())
    }
    
    /* 当一个类的实例被释放之前,析构器会被立即调用 */
    deinit {
        // 执行析构过程
    }
}
  1. 可选链
class Person {
    var residence: Residence?
    var name: String?
}

class Residence {
    var numberOfRooms = 1
}

let john = Person()
/* name可选,强制展开*/
let personName = john.name!
/* residence有可能为nul Swift就会在residence不为nil的情况下访问numberOfRooms */
let roomCount = john.residence?.numberOfRooms
  1. 异常处理
func processFile(filename: String) throws {
    if exists(filename) {
        let file = open(filename)
        /* defer语句在即将离开当前代码块时执行一系列语句 */
        defer {
            close(file)
        }
        while let line = try file.readline() {
            // 处理文件。
        }
        // close(file) 会在这里被调用,即作用域的最后。
    }
}
/* 如果processFile返回有值则fliePath有值,不然为nul fliePath为可选类型*/
let fliePath = try? processFile(filename: "path")
  1. 类型转换 -as -is
class MediaItem {
    // 父类
}
class Movie: MediaItem {
    // 子类一
}

class Song: MediaItem {
    // 子类二
}

let library = [
    Movie(),
    Song(),
]
// 检查类型
for item in library {
    if item is Movie {
       // movieCount += 1
    } else if item is Song {
       //songCount += 1
    }
}
// 向下转型
/*
 当你不确定向下转型可以成功时,用类型转换的条件形式(as?)
 只有你可以确定向下转型一定会成功时,才使用强制形式(as!)
 */
for item in library {
    if let movie = item as? Movie {

    } else if let song = item as? Song {

    }
}
  1. 扩展
  • 可以为一个类型添加新的功能,但是不能重写已有的功能。
  • 添加计算型属性和计算型类型属性
  • 定义实例方法和类型方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使一个已有类型符合某个协议
class SomeType{
    
}

extension SomeType {
    // 为 SomeType 添加的新功能写到这里
    var km: Double { return 100 * 1_000.0 }
}
  1. 协议语法
protocol SomeProtocol {
    // 这里是协议的定义部分
     var mustBeSettable: Int { get set }
    
     static func someTypeMethod()
}
 // 遵循协议时,应该将父类名放在协议名之前,多个协议以逗号分隔
class SomeClass: SomeProtocol {
   // 实现协议
    var mustBeSettable: Int = 1
    
    static func someTypeMethod() {
        
    }
}
  1. 协议的继承
protocol InheritingProtocol: SomeProtocol {

}
  1. 类类型专属协议
  • 添加 class 关键字来限制协议只能被类类型遵循
protocol SomeClassOnlyProtocol: class {

}
  1. 协议扩展
extension InheritingProtocol {
    // 添加扩展的协议
}
  1. 访问级别
  • Open 和 Public 级别可以让实体被同一模块源文件中的所有实体访问,在模块外也可以通过导入该模块来访问源文件里的所有实体。通常情况下,你会使用 Open 或 Public 级别来指定框架的外部接口。Open 和 Public 的区别在后面会提到。

  • Internal 级别让实体被同一模块源文件中的任何实体访问,但是不能被模块外的实体访问。通常情况下,如果某个接口只在应用程序或框架内部使用,就可以将其设置为 Internal 级别。

  • File-private 限制实体只能在其定义的文件内部访问。如果功能的部分细节只需要在文件内使用时,可以使用 File-private 来将其隐藏。

  • Private 限制实体只能在其定义的作用域,以及同一文件内的 extension 访问。如果功能的部分细节只需要在当前作用域内使用时,可以使用 Private 来将其隐藏。

  • Open 为最高访问级别(限制最少),Private 为最低访问级别(限制最多)。

  • Open 只能作用于类和类的成员,它和 Public 的区别如下:

  • Public 或者其它更严访问级别的类,只能在其定义的模块内部被继承。

  • Public 或者其它更严访问级别的类成员,只能在其定义的模块内部的子类中重写。

  • Open 的类,可以在其定义的模块中被继承,也可以在引用它的模块中被继承。

  • Open 的类成员,可以在其定义的模块中子类中重写,也可以在引用它的模块中的子类重写。

  1. 自定义运算符

运算符位置:

  • 前置运算符 prefix
  • 中间运算符 infix
  • 后置运算符 postfix
postfix operator |??
postfix func |?? (left: String?) -> String! {

    return left != nil ? left : "空"
}
var test1: String?
var test2 = "test2"
print(test1|??) // 打印 空
print(test2|??) // 打印 test2

/* 以上代码定义了一个新的运算符 |?? 判断左侧所给出的变量是否为nil,如果不为nil就返回该变量,如果为nil就返回 "空" */

swift学习电梯:
swift-基础类型
swift-函数
swift-类和结构体

swift

相关文章

  • iOS-swift4学习(类和结构体)

    类和结构体示列 属性观察器 willSet 在新的值被设置之前调用观察器会将新的属性值作为常量参数传入,在 wil...

  • Swift5.x-属性(中文文档)

    引言 继续学习Swift文档,从上一章节:结构体和类,我们学习了Swift结构体和类相关的内容,如结构体和类的定义...

  • 结构体和类(一)

    结构体和类模块分两篇笔记来学习: 第一篇: 结构体和类的区别 分析类和结构体可变性 以一个具体的例子来学习使用类和...

  • 结构体和类(二)

    结构体和类模块分两篇笔记来学习: 第一篇: 结构体和类的区别 分析类和结构体可变性 以一个具体的例子来学习使用类和...

  • swift4.0-11 类和结构体

    代码学习swift4.0, 类和结构体 //// main.swift// SwiftLearn11-类和结构...

  • 类和结构体

    类与结构体 本节内容包括: 类和结构体对比 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合类型的赋值与...

  • Swift Tour Learn (六) -- Swift 语法

    Swift语法基础(五)-- (类和结构体、属性、方法) 本章将会介绍 类和结构体对比结构体和枚举是值类型类是引用...

  • Swift结构体和类

    最近在学习,顺便总结和记录一下 结构体和类 要说结构体和类就需要先说说值类型和引用类型了 Swift的类型分为值类...

  • swift基础_结构体和类

    一.结构体和类 结构体张这个样子 类张这个样子 二.结构体和类的区别 针对结构体, 即使你没有定义函数,编译器也会...

  • Day9 类和结构体

    本页包含内容:• 类和结构体对比• 结构体和枚举是值类型• 类是引用类型• 类和结构体的选择• 字符串、数组、和字...

网友评论

      本文标题:iOS-swift4学习(类和结构体)

      本文链接:https://www.haomeiwen.com/subject/ekswpftx.html