반응형
Method 는 function과 마찬가지로 기능을 담당한다.
스트럭트와 관련 된 메소드
1. 스트럭트 생성, 함수생성, 인스턴스 생성
//스트럭트 생성
struct Lecture {
var title: String
var maxStudent: Int = 10
var numOfRegistered = 0
}
//인스턴스 생성
var lec = Lecture(title: "iOS Basic")
func remainSeats(of lec: Lecture) -> Int{
let remainSeats = lec.maxStudent - lec.numOfRegistered
return remainSeats
}
remainSeats(of: lec) //10
2. 관계된 함수를 만들고 스트럭트에 메서드로 구현하기
오브젝트는 서로 관계되어있는 것을 묶는 것인데 함수가 스트럭트에 관련있는 것 처럼 보이면 스트럭트 안에 넣어줘도 된다.
스트럭트에 메서드를 만드는 중 경고창이 나타났다.
// --> 경고창 Left side of mutating operator isn't mutable: 'self' is immutable
// 메서드를 실행하면 전체 스트럭트의 프로퍼티를 변형한다고 경고하는 것. 좌측에 mutating 입력할것
import UIKit
////스트럭트 생성
//struct Lecture {
// var title: String
// var maxStudent: Int = 10
// var numOfRegistered = 0
//}
//
////인스턴스 생성
//var lec = Lecture(title: "iOS Basic")
//
//func remainSeats(of lec: Lecture) -> Int{
// let remainSeats = lec.maxStudent - lec.numOfRegistered
// return remainSeats
//}
//
//remainSeats(of: lec) //10
//--> 오브젝트는 관계되어있는 것을 묶었고 스트럭트도 그래서 묶었는데 이 함수가 렉쳐에 들어가도될것 같다.
struct Lecture {
var title: String
var maxStudent: Int = 10
var numOfRegistered = 0
func remainSeats() -> Int{
let remainSeats = lec.maxStudent - lec.numOfRegistered
return remainSeats
}
// --> 경고창 Left side of mutating operator isn't mutable: 'self' is immutable
// 메서드를 실행하면 전체 스트럭트의 프로퍼티를 변형한다고 경고하는 것. 좌측에 mutating 입력할것
mutating func register() {
// 등록한 학생수 증가시키기
numOfRegistered += 1
}
//type property 렉쳐의 타입과 관련된 것이라면 바로 접근하게 하는 것
static let target: String = "Anybody want to learn something"
//type Method
static func 소속학원이름() -> String {
return "패캠"
}
}
var lec = Lecture(title: "iOS Basic")
lec.remainSeats() //10
//렉쳐에 사람들이 등록을 하는 함수 , 먼저 lec에서 뭘 하고 싶다는 메서드를 만들고 구현하기
lec.register()
lec.register()
lec.register()
lec.register()
lec.register()
lec.register()
lec.remainSeats() //4
Lecture.target //"Anybody want to learn something"
Lecture.소속학원이름() //"패캠"
extension 메서드 만들기
스트럭트의 바깥에서 기존의 스트럭트의 기능에 추가할 수 있다.
기존의 작업에 지장을 주지않는 것이 나을 때도 있다.
// 절대값을 구하는 Math 스트럭쳐
struct Math {
static func abs(value: Int) -> Int{
if value > 0 {
return value
} else {
return -value
}
}
}
Math.abs(value: -20) //20
//만약 여기에 제곱과 절반을 구하는 기능을 추가하고 싶다면??
// Math의 기능을 확장
extension Math {
static func square(value: Int) -> Int{
return value * value
}
static func half(value: Int) -> Int{
return value/2
}
}
Math.square(value: 5) //25
Math.half(value: 20) //10
// 처음부터 Math에 다 넣으면 되지 않을까?
// -> 기존에 있던 코드를 재정의를 하려면 항상 위에 추가하는게 정답은 아니다.
// 예) 애플에서 정의한 Int 에 제곱과 반값을 넣고 싶다면??
var value: Int = 3
//먼저 생성하고 구현할것
//value.square()
//value.half()
extension Int {
func square() -> Int{
return self * self
}
func half() -> Int {
return self/2
}
}
//
value.square() //9
value.half() //1 3나누기 2의 몫은 1
value = 10
value.square() //100
value.half() //5
반응형
'모바일앱 > Swift' 카테고리의 다른 글
생성자 이해하기, 2-phase Initialization, Convenience Initializer (0) | 2021.10.20 |
---|---|
클래스상속은 언제 하면 좋을까? (0) | 2021.10.19 |
상속 개념을 코드로 익히기 (0) | 2021.10.18 |
클래스, 언제 클래스? 언제 스트럭트? (0) | 2021.10.16 |
프로퍼티 vs 메소드 (0) | 2021.10.14 |
프로퍼티 개념 (0) | 2021.10.13 |
프로토콜 (0) | 2021.10.13 |
Struct만들기 도전과제 (0) | 2021.10.12 |