Swift 함수와 옵셔널

‍deprecated·2021년 1월 8일
0

Swift 시작하기

목록 보기
4/12
post-custom-banner
  • method : object에 속함 ex) object.methodName()

  • function : 독립적 호출 가능 ex)functionName()

Function

함수 형식

func printName(){
	print("~")
}
printName()

파라미터 1개

func printMultiple(value:Int){
	print("\(value)*10=\(value*10)")
}
printMultiple(value:5)

파라미터 2개

func printTotalPrice(price:Int, count:Int){
	print("total price : \(price*count)")
}
printTotalPrice(price:1500, count:5)

파라미터 이름 없이 value만 넘겨 쓰기

func printTotalPrice(_ price : Int, _ count : Int){~} 
printTotalPrice(1500, 5)

파라미터 이름 재지정

func printTotalPrice(가격 price : Int, 갯수 count : Int){~} 
printTotalPrice(가격: 1500, 갯수: 5)

default 파라미터 설정

func print2(price:Int = 1500, count:Int){
	print("TotalPrice : \(price*count)")
}
print2(count:5)
print2(price:2000, count:1)

return

func functionName(param: ParamType) -> ReturnType{
	return returnValue
}
func totalPrice(price:Int, count:Int) -> Int {
	let totalPrice = price*count
    return totalPrice
}
let price = totalPrice(price:10000, count:7)

Overload

같은 함수 이름이지만 parameter, return type이 다르다

func printTotalPrice(price:Int, count:Int){
	print("Total Price : ~")
}
func printTotalPrice(price:Double, count:Double){
	print("Total Price : ~")
}
func printTotalPrice(가격:Double, 갯수:Double){
	print("Total Price : ~")
}

Inout

파라미터는 기본적으로 복사되어 들어와 파라미터의 값을 수정하는 것이 불가능한데, Inout 이용시 파라미터의 값을 수정할 수 있다.

Function parameters are constants by default. Trying to change the value of a function parameter from within the body of that function results in a compile-time error. This means that you can’t change the value of a parameter by mistake. If you want a function to modify a parameter’s value, and you want those changes to persist after the function call has ended, define that parameter as an in-out parameter instead. - swift 공식 문서

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"

함수의 parameter로 함수 넘기기

예1)

func add(_ a:Int, _ b:Int) -> Int {
	return a+b
}
func subtract(_ a:Int, _ b:Int) -> Int {
	return a-b
}

var function = add
function(4, 2)

예2)

import UIKit
func add(_ a:Int, _ b:Int) -> Int {
    return a+b
}
func subtract(_ 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)
printResult(subtract, 10, 5)

Optional

var name:String = "Shawn"
var catName:String = "meow"
var carName:String = ??

없는 것을 어떻게 표현할 것인가? → nil
optional에 값이 없는 경우 → nil로 표현

var carName:String? = "Mercedes" 

또는

var carName:String?
carName=nil
print(carName)
let num = Int("10")

문자열을 Int로 casting시, 될 수도, 안 될 수도 있다. => num은 optional.

Optional 고급 기능

  • Forced Unwrapping
  • Optional binding (if let)
  • Optional binding (guard let)
  • Nil coalescing

Forced Unwrapping

var carName:String?
carName="mercedes"
print(carName) // Optional("mercedes")로 출력 됨
print(carName!) // mercedes 출력

하지만

carName=nil
print(carName!) // 오류. 억지로 까려 하니

그래서 부드럽게 까려면

Optional binding (if let)

var carName:String?
carName="mercedes"

if let unwrap = carName { // optional에 value 값이 있는 경우 할당
    print(unwrap)
} else {
    print("no")
}

함수 안에서 활용한다면

func printParsed(from: String){
    if let parsedInt = Int(from){
        print(parsedInt)
    } else{
        print("Int로 컨버팅 안됨")
    }
}
printParsed(from: "100")
printParsed(from: "100hello")

복잡해지면 Cyclomatic Complexity...

Optional binding (guard let)

func printParsed(from: String){
	guard let parsedInt = Int(from) else{
    	print("Int로 컨버팅 안됨")
        return
    }
    print(parsedInt)
}

조금 더 간단하다.

Nil Coalescing

nil일 경우 제시하는 명령을 수행하고 아니면 값 대입하기

The nil-coalescing operator (a ?? b) unwraps an optional a if it contains a value, or returns a default value b if a is nil.

let carName:String? // string optional
carName = nil
let myCarName:String = carName ?? "소나타" // 소나타 출력
profile
deprecated
post-custom-banner

0개의 댓글