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}
}
//...
Комментариев нет:
Отправить комментарий