::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