struct User {
var name: String
var age: Int
var city: String
}
var sun = User(name: "sun", age: 20, city: "Seoul")
print(sun.name) // sun
print(sun.age) // 20
struct User {
var name: String
var age: Int
var city: String
var isAdult: Bool {
if age >= 20 {
return true
} else {
return false
}
}
}
var sun = User(name: "sun", age: 19, city: "Seoul")
print(sun.isAdult) // true
sun.age = 20
print(sun.isAdult) // false
바뀌기 전에
특정 코드를 실행하고 싶다면 willSet
,바뀐 후에
실행하고 싶다면 didSet
사용struct Progress {
var task: String
var amount: Int {
didSet {
print("\(task) is now \(amount)% complete")
}
}
}
var progress = Progress(task: "Loading data", amount: 0)
progress.amount = 30 // Loading data is now 30% complete
progress.amount = 80 // Loading data is now 80% complete
progress.amount = 100 // Loading data is now 100% complete
func methodName(parameter...) -> returnType {//some code}
struct City {
var population: Int
func collectTaxes() -> Int {
return population * 1000
}
}
let seoul = City(population: 100)
print(london.collectTaxes()) // 100,000
함수 vs 메서드 ?
메서드는 구조체, 열거형, 클래스 등특정 타입에 속한다
는 점을 빼면 함수와 같음☝️ 대신 메서드는
자신이 속한 타입
의 다른프로퍼티
와메서드
에 접근 가능
mutating
을 표기해줘야 함var
로 선언된 인스턴스인 경우에만 mutating method
호출 가능struct Person {
var name: String
mutating func makeAnonymous() {
name = "Anonymous"
}
}
var person = Person(name: "sun")
person.makeAnonymous()
print(person.name) // Anonymous
memberwise initializer
가 있음struct User {
var username: String
}
var user = User(username: "sun") // memberwise initializer
init(){}
을 선언해 custom initializer
를 만들어 사용할 수 있음struct User {
var username: String
init() {
username = "Anonymous"
print("Creating a new user!")
}
}
var user = User() // OK
user.username = "sun"
var user2 = User(username: "sun") // KO : ERROR
self.
키워드를 사용할 수 있음struct Person {
var name: String
init(name: String) {
print("\(name) was born!")
self.name = name
}
}
Lazy
키워드를 프로퍼티 앞에 붙이면 해당 프로퍼티는 실제로 해당 프로퍼티에 (최초로) 접근이 이루어질 때 생성됨struct FamilyTree {
init() {
print("Creating family tree!")
}
}
struct Person {
var name: String
lazy var familyTree = FamilyTree()
init(name: String) {
self.name = name
}
}
var sun = Person(name: "Sun") // sun.familyTree does not exist
sun.familyTree // sun.familyTree now exists
nameOfStruct.staticProperty
로 호출struct Student {
static var classSize = 0
var name: String
init(name: String) {
self.name = name
Student.classSize += 1
}
}
var sun = Student(name: "Sun")
var moon = Student(name: "Moon")
var start = Student(name: "Star")
print(Student.classSize) // 3
private
키워드를 붙이면 해당 인스턴스 내부에서만 접근 가능struct Person {
private var id: String
init(id: String) {
self.id = id
}
func identify() -> String {
return "My social security number is \(id)"
}
}
let sun = Person(id: "12345")
sun.identify() // My social security number is 12345
print(sun.id) // KO : ERROR