среда, 1 июля 2020 г.

Swift, Protocols (interfaces)

Online Swift Playground 

//Protocols - value types (structs and enums) OR reference types (classes)
protocol Drawable {
    var image: String {get set}
    init?(image: String)
    func draw()
}

protocol Transform {
    associatedtype PosType
    var position: PosType {get set}
}

protocol Movable: Transform {
    var speed: Double {get set}
    func move(speed: Double)
}

class Sprite: Drawable, Movable{
    //typealias PosType = (x: Double, y: Double)
    var position: (x: Double, y: Double)
    var image: String
    var speed: Double = 0

    required init?(image: String){
        guard image != "" else {
            return nil
        }
        self.image = image
        self.position = (x:0, y:0)
    }

    func draw() {
        print("sprite: \(image)")
    }

    func move(speed: Double){
        self.speed = speed
        self.position.x += speed
        self.position.y += speed
        print("speed: \(self.speed)")
    }
}

var s1 = Sprite(image: "image.png")!
s1.draw()
s1.move(speed: 2.4)
print("position: \(s1.position)")

var drawType: Drawable.Type = Sprite.self
print(drawType)
let d1 = drawType.init(image: "image1.png")
d1?.draw()

var s2 = Sprite(image: "image2.png")!
var s3 = Sprite(image: "image3.png")!

let sprites:[Drawable] = [s1, s2, s3]

for sprite in sprites{
    sprite.draw()
}

//extensions, composition
protocol Sizable{
    var size: Double{get}
}

extension Sprite: Sizable{
    var size: Double { 1.0 }
}

func render(sprite: Drawable & Sizable){
     sprite.draw()
     print("size: \(sprite.size)")
}
render(sprite: s1)

//value types
protocol Weightable{
    var weight: Int {get set}
}

struct Box: Weightable{
    var size: String = "big"
    var weight: Int = 1
}

var sp1: Weightable = Box()
print(sp1.weight)
print((sp1 as! Box).size)
var sp2 = sp1 //copy
sp2.weight = 2
print(sp1.weight)
print(sp2.weight)

//ref types - only for classes
protocol RefWeightable: class{
    var weight: Int {get set}
}

//...

Комментариев нет:

Отправить комментарий