1 Function
- 매개변수가 있을 때와 없을 때 함수 정의 및 실행 방법
func printName() {
print("jsdysw");
}
printName();
func printTotalPrice(price: Int, count: Int) {
print("Total Price : \(price * count)")
}
printTotalPrice(price:1000, count: 5)
- 함수를 호출할때 매개변수의 이름을 안쓰고 값만 넘겨주고 싶다면 매개변수 앞에 _를 써준다.
- 매개변수 이름을 통해서 함수에게 값을 전달하는데 _를 쓰면 이름 없이 전달이 가능하다는 것을 의미한다.
- 이렇게 외부에서 보여지는 이름을 external name이라고 한다.
func printTotalPrice(_ price: Int, _ count: Int) {
print("Total Price : \(price * count)")
}
printTotalPrice(1000, 5)
- 그럼 price, count 대신 단가, 개수라는 이름으로 값을 전달하고 싶다면 다음처럼 하면 된다.
- 함수의 external name을 단가, 개수로 적어준다.
func printTotalPrice(단가 price: Int, 개수 count: Int) {
print("Total Price : \(price * count)")
}
printTotalPrice(단가: 1000, 개수:5)
- 매개변수로 값을 전달하지 않았을 때 default값을 설정하는 방법은 다음과 같다.
- price를 넘겨주지 않을 때 default로 1000을 사용한다는 뜻이다.
func printTotalPrice(price: Int = 1000, count: Int) {
print("Total Price : \(price * count)")
}
printTotalPrice(count:5)
printTotalPrice(price:2000, count:5)
- 함수가 값을 반환해야 하는 경우는 다음과 같다.
func totalPrice(price: Int, count: Int) -> Int {
return price * count
}
let calculatedPrice = totalPrice(price: 1500, count:5)
2 Funcion Overloading
- 같은 함수이름을 쓰면서 서로 다른 매개변수를 받는 함수를 만들 수 있다.
- 즉 input과 output이 다른데도 같은 이름의 함수를 만들 수 있는 기능이다.
func add(aInt:Int, bInt:Int) -> Int {
return aInt + bInt
}
func add(aDouble:Double, bDouble:Double) -> Double {
return aDouble + bDouble
}
add(aInt: 1, bInt: 2)
add(aDouble: 1.1, bDouble: 2.2)
3 Inout
- 함수를 호출할때 매개변수는 값이 복사되어 들어온다. 그런데 swift는 이 복사된 값을 const로 인식한다.
- 따라서 다음과 같이 a의 값을 변경시키려하면 에러가 난다.
- 따라서 inout이라는 키워드를 타입앞에 붙여준다.
var num = 1
func increment(a: inout Int) -> Int {
a += 1
return a
}
increment(a: &num)
print(num);
*여기서 num이라는 변수의 값을 increment에서 바꾸고 싶다면 num을 넘길때 &num으로 전달해줘야 한다.
*만약 num만 넘기면 num의 값이 매개변수 a로는 복사되고 a만 변하기 때문이다.
3 함수를 매개변수로 넘기기
- 이전 예제 에서는 변수만 인자로 함수에게 넘겨주었다.
- 이번에는 함수를 함수에게 전달해보자.
- swift에서는 함수를 변수에 할당할 수 있다.
- 그리고 그 변수를 통해서 함수를 호출하는 것도 가능하다.
func add(a: Int, b:Int) -> Int {
return a+b
}
let addFunction = add;
addFunction(6, 4)
- option키를 누르고 변수를 클릭하면 변수의 타입을 알 수 있다.
- addFunction의 타입은 (Int, Int) -> Int이다.
- 그럼 이제 add라는 함수, 서로 더할 두 변수를 인자로 받아서 결과를 출력하는 함수를 만들어보자.
- 함수도 타입이 있기 때문에 같은 타입의 parameter를 넘기도록 하자
func add(a:Int, b:Int) -> Int {
return a+b
}
func printResult(_ function: (Int,Int)->Int, _ a:Int, _ b:Int) {
let result = function(a,b)
print(result)
}
printResult(add, 10, 5)
4 Optional
- var money:Int 라는 변수를 정의했다고 하자.
- 변수에 값이 있으면 10, 100등의 value가 저장되어있을 것이다.
- 변수에 값이 들어있으면 그 value를 보여주면 되는데 만약 변수에 값이 없다면 이를 어떻게 표현할까? 그럴때 nil을 사용한다.
- String타입의 변수 name을 정의한다.
- 여기서 ?를 optional이라고 하는데 name에 value가 있을 수도 없을 수도 있다는 것을 의미한다.
- name을 정의하고 값을 대입한 적이 없기 때문에 nil이라고 표현된다.
var name:String?
name = "jsdysw"
name = nil
- 위의 그림처럼 name에 값을 넣었다가 다시 비우고 싶으면 nil을 대입하면 된다.
- 아래 정의한 num의 타입을 추론해보자.
- 문자열을 Int로 캐스팅 했을때 "hi"였다면 캐스팅이 실패하고 값을 담을 수 없을 것이다.
- 이렇게 int로 변환되어 숫자가 들어갈 수도 캐스팅이 실패해서 nil이 들어갈 수도 있는 경우 Int?로 추론된다.
5 Forced unwrapping
- optional? 타입의 변수에 있는 값에 접근하려면 어떻게 해야할까?
- 값이 있을 수도 없을 수도 있기 때문에 값을 꺼내려 하면 다음과 같은 warning과 결과가 나온다.
- 값이 있음을 확신할 수 있다면 !를 사용해서 강제로 값을 꺼내와도 무방하다.
6 Optional Binding
- 이번에는 if문으로 조금 부드럽게 optional 타입의 값을 꺼내와 보자.
- 값이 있다면 그 값을 받아서 출력하고 없다면 no name을 출력한다.
let name : String? = "jsdysw"
if let unwrappedName = name {
print(unwrappedName)
} else {
print("no name")
}
- 이런 방식으로 String을 받아서 Int로 변환해주는 함수를 만들어보자 만약 Int로 parsing이 불가능하다면 문구를 띄워주자.
func printParsedInt(from : String) {
if let result = Int(from) {
print(result)
} else {
print("Parsing failed")
}
}
printParsedInt(from: "10")
printParsedInt(from: "jsdysw")
7 Optional Binding - guard사용
- guard 문을 사용해서 optional의 값을 부드럽게 확인하는 두번째 방법이다.
- condition result를 확인하여 만족을 못 시킬 경우 parsing failed를 출려하고 함수를 종료한다.
- condition을 만족하면 뛰어넘고 print(result)가 수행된다.
func printParsedInt(_ from : String) {
guard let result = Int(from) else {
print("Parsing failed")
return
}
print(result)
}
printParsedInt("10")
printParsedInt("jsdysw")
8 Nil coalescing
- 바로 사용 예를 살펴보자
let name: String? = "jsdysw"
let whatIsYourName : String = name ?? "Blank"
- String optional 타입의 변수 name이 있다
- name의 값을 꺼내서 whatIsYourName에 넣으려고 하는데 String이라고 표시해 줌으로써 타입을 String으로 만들어준다.
- 대신 name이 nil인 경우 를 대비해서 ?? "Blank"를 넣는다. 즉 name이 nil이면 Blank를 사용한다는 것이다.
'ComputerScience > ios App(Storyboard)' 카테고리의 다른 글
ios - 9 swift 기본문법 (Closure) (0) | 2021.07.21 |
---|---|
ios - 8 swift 기본문법(Array, Dictionary, Set) (0) | 2021.07.21 |
ios - 6 swift 기본문법(Tuple, Flow Control) (0) | 2021.01.28 |
ios - 5 Auto Layout, 앱 아이콘, 이름 설정 (0) | 2021.01.28 |
ios - 4 Outlet, Image View (0) | 2021.01.27 |