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

2018-07-17  本文已影响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. 属性观察器
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. 类类型专属协议
protocol SomeClassOnlyProtocol: class {

}
  1. 协议扩展
extension InheritingProtocol {
    // 添加扩展的协议
}
  1. 访问级别
  1. 自定义运算符

运算符位置:

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
上一篇下一篇

猜你喜欢

热点阅读