вторник, 16 июня 2020 г.

Swift, Structures, Properties

Online Swift Playground 

//Structures (Value type)
import Foundation

struct Point {
    var x: Int
    var y: Int
}

struct Line: CustomStringConvertible {
    var start: Point
    var end: Point
    var description: String {
        """
        Line [
            start: Point(x: \(start.x), y: \(start.y))
            end: Point(x: \(end.x), y: \(end.y))
        ]\n
        """
    }

    func length() -> Double{
        let X = Double(start.x - end.x)
        let Y = Double(start.y - end.y)
        return (X * X + Y * Y).squareRoot()
    }
}

let p1 = Point(x: 1, y: 1)
let p2 = Point(x: 5, y: 5)
var l1 = Line(start: p1, end: p2)
print("length of line: \(l1.length())\n")

var l2 = l1 //copy on assignment
l2.start.x = 3; l2.start.y = 3
l2.end.x = 8; l2.end.y = 8
print(l1)
print(l2)

//Stored properties
struct Contact {
    var name: String //mutable
    let email: String //immutable (const)
    var nation = "Z" //default value
}

var person1 = Contact(name: "Ivan Ivanov", email: "ivan@ivanov.com")
person1.name = "Petr Petrov"
//person1.email = "petr@petrov.com" // error
print("\nName: \(person1.name) \nEmail: \(person1.email) \nNation: \(person1.nation) \n")

var person2 = Contact(name: "Petr Petrov", email: "petr@petrov.com", nation: "alive")
print("\nName: \(person2.name) \nEmail: \(person2.email) \nNation: \(person2.nation) \n")

//Computed properties
import Foundation

struct Line {
    var start: (x: Int, y: Int)
    var end: (x: Int, y: Int)

    var length: Double { //read only by def
        let X = Double(start.x - end.x)
        let Y = Double(start.y - end.y)
        return (X * X + Y * Y).squareRoot().rounded()
    }
}

var line1 = Line(start: (x: 1, y: 1), end: (x: 5, y: 5))
print("length of the line: \(line1.length)")

//Getters and Setters
struct Person {
    var name: String
    var surname: String
    var age: Int

    var fullName: String {
        get {
            return name + " " + surname
        }
        set {
            let arr = newValue.split(separator: " ")
            name = String(arr[0])
            surname = String(arr[1])
        }
    }
}

var person1 = Person(name: "Ivan", surname: "Ivanov", age: 42)
print(person1.fullName)
person1.fullName = "Petr Petrov"
print(person1)

//Type properties (static)
struct TeamMember {
    static var memberCount: Int = 0
    let name: String
    let role: String
}

let tm1 = TeamMember(name: "Mike", role: "Artist")
TeamMember.memberCount += 1
let tm2 = TeamMember(name: "Tom", role: "Manager")
TeamMember.memberCount += 1
print(TeamMember.memberCount) //2

//Property observers
struct TeamMember {
    static var memberCount: Int = 0
    let name: String
    let role: String
    var active: Bool = false {
        didSet {
            if active {
                Self.memberCount += 1
            } else if Self.memberCount > 0 {
                Self.memberCount -= 1
            }
        }
    }
}

var tm1 = TeamMember(name: "Mike", role: "Artist")
tm1.active = true
var tm2 = TeamMember(name: "Tom", role: "Manager")
tm2.active = true
print(TeamMember.memberCount) //2
tm2.active = false
print(TeamMember.memberCount) //1

//Limiting a variable
struct Lamp {
    var on: Bool = false
    var maxWat: Int = 0 {
        didSet {
            if maxWat <= 35 && maxWat > 0{
                on = true
            }else if maxWat == 0 {
                on = false
            }else{
                maxWat = oldValue
            }
        }
    }

}

var l1 = Lamp()
print(l1)
l1.maxWat = 50
print(l1)

//Lazy properties
import Foundation

struct Line {
    var start: (x: Int, y: Int)
    var end: (x: Int, y: Int)

    lazy var length: Double = {
        let X = Double(start.x - end.x)
        let Y = Double(start.y - end.y)
        return (X * X + Y * Y).squareRoot()
    }()

    var middle: Double {
        mutating get {
            length / 2
        }
    }
}

var line1 = Line(start: (x: 1, y: 1), end: (x: 5, y: 5))
print("middle of the line: \(line1.middle)")

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

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