본문 바로가기
::public/Swift

Structure

by 해맑은욱 2022. 11. 11.
import UIKit

struct Person {
    var firstName: String {
        // 값이 바뀌기 전
        willSet {
            print("willSet: \(firstName) --> \(newValue)")
        }
        // 값이 바뀐 후
        didSet {
            print("didSet: \(oldValue) --> \(firstName)")
        }
    }
    var lastName: String
    
    // 변수가 사용되기 전에는 메모리에 올라가지 않는다. 쓰레드에서 애러날 수 있음.
    lazy var isPopular: Bool = {
        if fullName == "Jay Park" {
            return true
        } else {
            return false
        }
    }()
    
    var fullName:String {
        get {
            return "\(firstName) \(lastName)"
        }
        
        set {
            // newValue "Jay Park"
            if let firstName = newValue.components(separatedBy: " ").first {
                self.firstName = firstName
            }
            
            if let lastName = newValue.components(separatedBy: " ").last {
                self.lastName = lastName
            }
        }
    }
}

var person = Person(firstName: "Jason", lastName: "Lee")

person.firstName
person.lastName

person.firstName = "Jim"
person.lastName = "Kim"

person.firstName
person.lastName

person.fullName
person.fullName = "Jay Park"
person.firstName
person.lastName


// 프로토콜(protocol): 서비스를 이용해야 할때 반드시 해야할 목록..
// CustomStringConvertible: 프로토콜의 종류..description을 정의해야 한다.
struct Lecture: CustomStringConvertible {
    var description: String {
        return "Title is : \(title)"
    }
    
    var title: String
    var maxStudents: Int = 10
    var numOfRegistered: Int = 0
    
    func remainSeats() -> Int {
        let remainSeats = maxStudents - numOfRegistered
        return remainSeats
    }
    
    // mutating: 구조체 내의 값을 변경할때 사용해야 함.
    mutating func register() {
        numOfRegistered += 1
    }
    
    static let target: String = "Anybody want to learn something"
    
    static func academy() -> String {
        return "iOS Academy"
    }
}

var lec = Lecture(title: "iOS Basic")
// 프로토콜로
print(lec) // "Title is : iOS Basic\n"

// 구조체 내부 구현으로..
//func remainSeats(of lec: Lecture) -> Int {
//    let remainSeats = lec.maxStudents - lec.numOfRegistered
//    return remainSeats
//}

//remainSeats(of: lec)
lec.remainSeats() // 10

lec.register()
lec.register()
lec.register()
lec.register()

lec.remainSeats() // 6

Lecture.target  // Anybody want to learn something
Lecture.academy()   // iOS Academy



struct Math {
    static func abs(value: Int) -> Int {
        if value > 0 {
            return value
        } else {
            return -value
        }
    }
}

Math.abs(value: -20)

// extension: 메소드를 확장시킨다
extension Math {
    static func square(value: Int) -> Int {
        return value * value
    }
    
    static func half(value: Int) -> Int {
        return value / 2
    }
}

var value: Int = 10

// Swift 에 정의된 구조체에도 임의적으로 메소드를 추가할 수 있음.
extension Int {
    func square() -> Int {
        return self * self
    }
    
    func half() -> Int {
        return self / 2
    }
}

value.square()   // 100
value.half()    // 5

'::public > Swift' 카테고리의 다른 글

Class extention  (0) 2022.11.23
protocol  (0) 2022.11.16
Closure  (0) 2022.11.07
Set  (0) 2022.11.07
Dictionary  (0) 2022.11.06