пятница, 2 февраля 2018 г.

Swift 14. Properties

В 14 уроке рассмотрена первая часть главы Properties из документации - вычисляемые свойства и свойства для хранения
Домашнее задание:

import Foundation
/*
 1. Самостоятельно повторить проделанное в уроке

 2. Добавить студенту property «Дата рождения» (пусть это будет еще одна структура, содержащая день, месяц, год) и два computed property: первое — вычисляющее его возраст, второе — вычисляющее, сколько лет он учился (считать, что он учился в школе с 6 лет, если студенту меньше 6 лет — возвращать 0)

 3. Создать структуру «Отрезок», содержащую две внутренние структуры «Точки». Структуру «Точка» создать самостоятельно, несмотря на уже имеющуюся в Swift’е. Таким образом, структура «Отрезок» содержит две структуры «Точки» — точки A и B (stored properties). Добавить два computed properties: « середина отрезка» и «длина» (считать математическими функциями)

 4. При изменении середины отрезка должно меняться положение точек A и B. При изменении длины, меняется положение точки B
 */

struct Student {
    var firstName: String {
        willSet {
            print("FirstName willSet. New value:", newValue)
        }
        didSet {
            print("firstName didSet. Old Value:", oldValue)
            firstName = firstName.capitalized
        }
    }
    var lastName: String {
        didSet {
            lastName = lastName.capitalized
        }
    }
    var fullName: String {
        get {
            return firstName + " " + lastName
        }
        set {
            let words = newValue.split(separator: " ")
            firstName = String(words.first ?? "Error firstName")
            lastNameString(words.last ?? "Error lastName")
        }
    }
    let birthDate: BirthDate
    
    var age: Int? {
        if let date = birthDate.date {
            let calendar = Calendar.current
            let currentComponent = calendar.dateComponents([.year], from: date, to: Date())
            return currentComponent.year
        }
        
        return nil;
    }
    var studyYear: Int {
        if age != nil && age! > 6 {
            return age! - 6;
        }
        return 0
    }
}

struct BirthDate {
    let day: Int
    let month: Int
    let year: Int
    var date: Date? {
        let calendar = Calendar.current
        return calendar.date(from: DateComponents(year: year, month: month, day:day))
    }
    
    
}

var student1 = Student(firstName: "Alex", lastName: "Ivanov", birthDate: BirthDate(day: 04, month: 08, year: 1983))
student1.firstName = "Ivan"
student1.fullName = "sAm baggIns"
print("Student 1. Fistname: \(student1.firstName), lastName: \(student1.lastName), fullName: \(student1.fullName). Age: \(student1.age!). Study year: \(student1.studyYear). Date: \(student1.birthDate.date!). ")

/*
 3
 */

print("\nN 3, 4, 5\n")

struct PointSegment {
    var x: Double
    var y: Double
    var description: String {
        return "(\(x), \(y))"
    }
}

struct LineSegment {
    var a: PointSegment
    var b: PointSegment
    var middle: PointSegment {
        get {
            return PointSegment(x: (b.x + a.x) / 2, y: (b.y + a.y) / 2)
        }
        set {
            let deltaX = newValue.x - middle.x
            let deltaY = newValue.y - middle.y
            a.x += deltaX
            b.x += deltaX
            a.y += deltaY
            b.y += deltaY
            
        }
    }
    var length: Double {
        get {
            return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2))
        }
        set {
            let newX = (a.x + newValue * (b.x - a.x) / length)
            let newY = (a.y + newValue * (b.y - a.y) / length)
            b = PointSegment(x:  newX, y: newY)
        }
    }
    var description: String {
        return "Segment: A(\(a.description)B\(b.description)). Middle: \(middle.description). Length = \(length)"
    }
}
var segment = LineSegment(a: PointSegment(x: 0, y: 0), b:(PointSegment(x: 2, y: 2)))

print("Segment: \(segment.description)." )

segment.middle = PointSegment(x: 0, y: 0)
print("Segment: \(segment.description)." )

segment.length = 2
print("Segment: \(segment.description)." )
segment.length = 3
print("Segment: \(segment.description)." )



Console

FirstName willSet. New value: Ivan
firstName didSet. Old Value: Alex
FirstName willSet. New value: sAm
firstName didSet. Old Value: Ivan
Student 1. Fistname: Sam, lastName: Baggins, fullName: Sam Baggins. Age: 34. Study year: 28. Date: 1983-08-03 16:00:00 +0000. 

N 3, 4, 5

Segment: Segment: A((0.0, 0.0)B(2.0, 2.0)). Middle: (1.0, 1.0). Length = 2.82842712474619.
Segment: Segment: A((-1.0, -1.0)B(1.0, 1.0)). Middle: (0.0, 0.0). Length = 2.82842712474619.
Segment: Segment: A((-1.0, -1.0)B(0.414213562373095, 0.414213562373095)). Middle: (-0.292893218813453, -0.292893218813453). Length = 2.0.
Segment: Segment: A((-1.0, -1.0)B(1.12132034355964, 1.12132034355964)). Middle: (0.0606601717798214, 0.0606601717798214). Length = 3.0.

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

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