swift 메소드 정리
메서드
메서드는 특정 타입에 관련된 함수를 뜻한다.
스위프트에서 클래스, 구조체, 열거형 은 인스턴스 메서드를 정의할 수 있다.
또한 타입 자체와 관련된 기능을 실행하는 타입 메서드를 정의할 수도 있다.
인스턴스 메서드
인스턴스 메서드는 특정 타입의 인스턴스에 속한 함수를 뜻한다.
인스턴스 내부의 프로퍼티 값을 변경하거나 특정 연산 결과를 반환하는 등 인스턴스와 관련된 기능을 실행한다.
인스턴스 메서드는 인스턴스가 존재할 때만 사용할 수 있다.
참고로 아래 코드에서 LevelClass의 인스턴스 메서드가 level 인스턴스 프로퍼티의 값을 수정한다.
자신의 프로퍼티 값을 수정할 때 클래스의 인스턴스 메서드는 크게 신경 쓸 필요가 없다.
하지만 구조체나 열거형은 값 타입이므로 메서드 앞에 mutating 키워드를 붙여서 해당 메서드가 인스턴스 내부의 값을 변경한다는것을 명시해야 한다.
class LevelClass{
var level:Int = 0 {
didSet{
print("Level:\(level)")
}
}
// 레벨 업
func levelUp(){
print("레벨업!")
level += 1
}
// 레벨 감소
func levelDown(){
print("레벨다운!")
level -= 1
if level < 0 {
reset()
}
}
// 특정 레벨 이동
func jumpLevel(to:Int){
print("jump to \(to)")
level = to
}
// 리셋
func reset(){
print("reset!")
level = 0
}
}
var levelClassInstance:LevelClass = LevelClass()
levelClassInstance.levelUp()
//레벨업!
//Level:1
levelClassInstance.levelDown()
//레벨다운!
//Level:0
levelClassInstance.levelDown()
//Level:-1
//reset!
//Level:0
levelClassInstance.jumpLevel(to: 5)
//jump to 5
//Level:5
print("")
struct LevelStruct{
var level:Int = 0 {
didSet{
print("struct - Level:\(level)")
}
}
// 레벨 업
mutating func levelUp(){
print("struct - 레벨업!")
level += 1 //Left side of mutating operator isn't mutable: 'self' is immutable
}
// 레벨 감소
mutating func levelDown(){
print("struct - 레벨다운!")
level -= 1
if level < 0 {
reset()
}
}
// 특정 레벨 이동
mutating func jumpLevel(to:Int){
print("struct - jump to \(to)")
level = to //Cannot assign to property: 'self' is immutable
}
// 리셋
mutating func reset(){
print("struct - reset!")
level = 0
}
}
var levelStructInstance : LevelStruct = LevelStruct()
levelStructInstance.levelUp()
//struct - 레벨업!
//struct - Level:1
levelStructInstance.levelDown()
//struct - 레벨다운!
//struct - Level:0
self 프로퍼티
모든 인스턴스는 암시적으로 생성된 self 프로퍼티를 갖는다.
self는 자기자신을 가리키는 프로퍼티이다.
스위프트는 변수를 사용할때 자동으로 메서드 내부에 선언된 1.지역변수를 먼저 사용하고, 그 다음 2.매개변수, 3.인스턴스의 프로퍼티 순으로 사용을 한다.
또한, self 프로퍼티의 다른 용도는 값 타입 인스턴스 자체의 값을 치환할 수도 있다.
클래스와 인스턴스는 참조타입이라 self 프로퍼티에 다른 참조를 할당 할 수 없다.
구조체나 열거형 등은 self 프로퍼티를 사용하여 자신 자체를 치환할 수도 있다.
class LevelClassTwo{
var level : Int = 0
func reset() {
//self = LevelClassTwo() //Cannot assign to value: 'self' is immutable
}
}
struct LevelStructTwo{
var level:Int = 0 {
didSet{
print("struct - Level:\(level)")
}
}
// 레벨 업
mutating func levelUp(){
print("struct - 레벨업!")
level += 1
}
// 리셋
mutating func reset(){
print("struct - reset!")
self = LevelStructTwo()
}
}
print("")
var leveStructInstanceTwo = LevelStructTwo()
leveStructInstanceTwo.levelUp()
//struct - 레벨업!
//struct - Level:1
print(leveStructInstanceTwo.level) //1
print("")
leveStructInstanceTwo.reset() //struct - reset!
print(leveStructInstanceTwo.level) //0
enum OnOffSwitch{
case on, off
mutating func nextState(){
self = self == .on ? .off : .on
}
}
'아이폰 개발 > Swift' 카테고리의 다른 글
swift DispatchGroup 과 DispatchSemaphore 실무에 사용+ 실험 (0) | 2021.12.07 |
---|---|
swift custom loading view, custom indicator (0) | 2021.10.25 |
swift AVAudioPlayer 로 음악앱 만들기 (0) | 2021.10.10 |
swift network conection 체크 - 인터넷 연결 체크 (0) | 2021.10.06 |
swift stackview 안에 view 동적으로 생성하기 (0) | 2021.10.05 |