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