본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.
프로퍼티는 클래스, 구조체 또는 열거형 등에 관련된 값을 뜻하고 메서드는 특정 타입에 관련된 함수를 뜻한다.
프로퍼티는 크게 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티로 나눌 수 있다.
struct Person {
var name: String
var age: Int
}
let zooneon: Person = Person(name: "zooneon", age: 100)
class Book {
var title: String
let author: String
init(title: String, author: String) {
self.title = title
self.author = author
}
}
let favoriteBook: Book = Book(title: "Harry Potter", author: "Joan K. Rowling")
lazy
키워드를 사용한다.var
키워드를 사용하여 변수로 정의한다.struct Favorite {
var food: String = "sushi"
var music: String = "k-pop"
}
class Person {
lazy var favorite: Favorite = Favorite()
let name: String
init(name: String) {
self.name = name
}
}
let zooneonInfo: Person = Person(name: "zooneon")
print(zooneonInfo.favorite) //Favorite(food: "sushi", music: "k-pop")
struct Person {
var name: String
var age: Int
//연산 프로퍼티
var personInfo: Person {
//접근자
get {
return Person(name: name, age: age)
}
//설정자
set(info) {
name = info.name
age = info.age
}
}
}
var zooneonInfo: Person = Person(name: "zooneon", age: 100)
print(zooneonInfo) //Person(name: "zooneon", age: 100)
print(zooneonInfo.personInfo) //Person(name: "zooneon", age: 100)
zooneonInfo.personInfo = Person(name: "Junwon", age: 24)
print(zooneonInfo) //Person(name: "Junwon", age: 24)
willSet
메서드와 프로퍼티의 값이 변경된 직후에 호출하는 didSet
메서드가 있다.willSet
메서드에 전달되는 전달인자는 프로퍼티가 변경될 값이고, didSet
메서드에 전달되는 전달인자는 프로퍼티가 변경되기 전의 값이다.willSet
메서드에는 newValue
, didSet
메서드에는 oldValue
라는 매개변수 이름이 자동 지정된다.class Account {
var credit: Int = 0 {
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet {
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
}
}
}
let myAccount: Account = Account()
//잔액이 0원에서 1000원으로 변경될 예정입니다.
myAccount.credit = 1000
//잔액이 0원에서 1000원으로 변경되었습니다.
class AClass {
static var typeProperty: Int = 0
var instanceProperty: Int = 0 {
didSet {
Self.typeProperty = instanceProperty + 100
}
}
static var typeComputedProperty: Int {
get {
return typeProperty
}
set {
typeProperty = newValue
}
}
}
AClass.typeProperty = 123
let classInstance: AClass = AClass()
classInstance.instanceProperty = 100
print(AClass.typeProperty) //200
print(AClass.typeComputedProperty) //200
메서드는 특정 타입에 관련된 함수를 말한다. 스위프트에서는 구조체와 열거형도 메서드를 가질 수 있다.
mutating
키워드를 붙여 해당 메서드가 인스턴스 내부의 값을 변경한다는 것을 명시해야 한다.struct LevelStruct {
var level: Int = 0 {
didSet {
print("Level \(level)")
}
}
mutating func levelUp() {
print("Level Up")
level += 1
}
mutating func levelDown() {
print("Level Down")
level -= 1
if level < 0 {
reset()
}
}
mutating func jumpLevel(to: Int) {
print("Jump to \(to)")
level = to
}
mutating func reset() {
print("Reset")
level = 0
}
}
var levelStructInstance: LevelStruct = LevelStruct()
levelStructInstance.levelUp() //Level Up
//Level 1
levelStructInstance.levelDown() //Level Down
//Level 0
levelStructInstance.levelDown() //Level Down
//Level -1
//Reset
//Level 0
levelStructInstance.jumpLevel(to: 3) //Jump to 3
//Level 3
self
프로퍼티
self
프로퍼티를 갖는다.self
프로퍼티는 자바의 this
와 비슷하게 인스턴스 자기 자신을 가리키는 프로퍼티이다.self
프로퍼티는 인스턴스를 더 명확히 지칭하고 싶을 때 사용한다.callAsFunction
callAsFunction
이라는 메서드를 구현하면 된다.struct Person {
var name: String = "zooneon"
func callAsFunction() {
print("Hi")
}
func callAsFunction(food: String) {
print("\(food)를 좋아합니다.")
}
func callAsFunction(hometown: String, age: Int) {
print("고향은 \(hometown)이며 나이는 \(age)살 입니다.")
}
}
var zooneon: Person = Person()
zooneon.callAsFunction() //Hi
zooneon() //Hi
zooneon.callAsFunction(food: "초밥") //초밥를 좋아합니다.
zooneon(food: "초밥") //초밥를 좋아합니다.
zooneon.callAsFunction(hometown: "서울", age: 24) //고향은 서울이며 나이는 24살 입니다.
zooneon(hometown: "서울", age: 24) //고향은 서울이며 나이는 24살 입니다.
static
키워드와 class
키워드를 사용할 수 있다.static
으로 정의하면 상속 후 메서드 재정의가 불가능하고 class
로 정의하면 상속 후 메서드 재정의가 가능하다.self
프로퍼티가 타입 그 자체를 가르킨다.class AClass {
static func staticTypeMethod() {
print("AClass staticTypeMethod")
}
class func classTypeMethod() {
print("AClass classTypeMethod")
}
}
class BClass: AClass {
/*
override static func staticTypeMethod() {
//오류 발생
}
*/
override class func classTypeMethod() {
print("BClass classTypeMethod")
}
}
AClass.staticTypeMethod() //AClass staticTypeMethod
AClass.classTypeMethod() //AClass staticTypeMethod
BClass.staticTypeMethod() //AClass staticTypeMethod
BClass.classTypeMethod() //BClass classTypeMethod