Swift의 온도

Swift #7 - 함수

IT의 온도 2021. 1. 12. 03:02

 

1. 함수 정의와 사용

 

- 애플리케이션의 동작

#동작의 기본 단위 : 함수

 

- 함수 작성

#func 키워드로 정의

#함수의 리턴 타입

#함수 이름

#함수 파라피터

 

#함수 정의

*파라미터, 리턴 값이 없는 함수
 
func greeting() {
    print("Hello Swift")
}
 
*사용
greeting()
cs

 

#함수의 실행 결과

* ->로 결과 타입 작성
*반환 타입이 없으면 (Void- 생략 가능
 
func greeting() -> Void {
}
 
*반환 타입과 같은 타입의 값 반환
 
func areYouOK -> Bool {
    return true
}
func favoriteDrink() -> String {
    return "Coffee"
}
cs

 

- 함수 반환값

#다수의 값 반환 : 튜플

*튜플 반환 함수 정의
 
func random3() -> (IntIntInt) {
    let r1 = Int(arc4random() % 10)
    let r2 = Int(arc4random() % 10)
    let r3 = Int(arc4random() % 10)
 
    return (r1, r2, r3)
}
 
*사용
 
var (num1, num2, num3) = random3()
print("Random1 : \(num1) Random2 : \(num2) Random3 : \(num3)")
cs

 

2. 함수 파라미터

 

- 함수 파라미터

#파라미터가 있는 함수

*파라미터 1개
 
func greeting(person:String) {
    print("Hello" + person)
}
 
*파라미터 2개
 
func greeting(person: String, emotion: String) {
    print("Hello" + person + "with" + emotion)
}
cs

 

-  파라미터 이름

#내부 파라미터 이름

*함수 내부에서 접근, 사용
*함수 외부에서 접근/사용 불가
 
func greeting(person: String) {
    print("Hello" + person)
}
cs

 

#외부 파라미터 이름

*함수 외부(함수 호출)에서 사용
*함수 내부에서 접근 불가
*내부 파라미터 이름으로 자동 적용
 
func greeting(person: String) {
    print("Hello" + person)
}
greeting(person:"My Friend")
 
*파라미터가 2개인 함수 호출
 
greeting(person:"My Friend", emotion:"Smile")
cs

 

*수동으로 설정하기 - 파라미터 앞에 선언
*별도로 설정하지 않으면 - 내부 파라미터 이름과 동일
 
func greeting(who person : String) {
    print("Hello" + person)
}
greeting(who: "Swift")
 
func greeting(person:Stringwith emotion: String) {
    print("Hello" + person + "with" + emotion)
}
greeting(person: "My Friend, with: "Hug")
cs

 

- 외부 파라미터 이름 사용 생략

*_기호 사용
 
func greeting(_person: String) {
    print("Hello" + person)
}
greeting("Friend")
 
func greeting(person: String, _emotion: String) {
    print("Hello" + person + "with" + emotion)
}
greeting(person: "Swift""Passion")
cs

 

- 오버로딩

*같은 함수 이름, 다른 파라미터 타입
 
func sayHello(msg : String) {
    print("sayHello(msg:)")
}
 
*다른 외부 파라미터 이름
 
func sayHello(_msg : String) {
    print("sayHello(_:)")
}
 
*다른 파라미터 타입
 
func sayHello(_times : Int) {
    print("sayHello(_:)")
}
cs

 

- 파라미터 기본값

* =기호와 함께 기본값 설정
* 호출 시 생략 가능
 
func greeting(person : String = "Friend") {
    print("Hello \(person)")
}
 
greeting(person: "Mom")
greeting()
 
* 혼동 주의
 
greeting(whom: "World")
 
* 어느 메소드가 실행되는가?
 
func greeting(whom person : String) {
    print("Hello" + peroson)
}
func greeting(whom person : String. emotion : String = "Happy") {
    print("Hello" + person + "with" + emotion)
}
cs

 

- 가변 길이 파라미터

*개수가 정해지지 않은 다수의 파라미터
*타입에 '...' 사용
*함수 파라미터에 하나만 사용 가능
*함수 내부에서 배열로 사용
 
func addAll(_values : Int-> Int {
    print(values.count)
    for v in values {
        print(v)
     }
}
 
*호출
 
addAll(123)
cs

 

- inout 파라미터

#파라미터 상수

*파라미터 : 함수 내부에서는 상수로 사용
*파라미터 변경 시도 시 에러
 
func tryParameterChange(_arg : Int) {
    arg = arg +1 //Error
}
cs

 

#파라미터 값 변경하기 : inout 선언

*파라미터 타입 앞에 inout 작성
*두 값을 바꾸기(swap) 예
 
func swapTwoValue(_ arg1 : inout Int, _ arg2 : inout Int) {
    let temp = arg1
    arg1 = arg2
    arg2 = temp
}
 
*호출 : &사용
 
var value1 = 1
var value2 = 2
swapTwoValue(&value1, &value2)
cs

 

3. 함수와 옵셔널

 

- 옵셔널

*함수 파라미터 옵셔널
*반환 타입 옵셔널
*옵셔널로 선언해야 nil 사용 가능
 
func sayHello(who : String) {
    print("Hello \(who)")
}
 
sayHello(who: nil) // Error
cs

 

-  옵셔널 반환 타입

#동작 결과로 옵셔널 타입의 값 반환

func nilReturnFunction() -> Int? {
    return nil
}
 
*ret의 타입은?
 
let ret = nilReturnFunction()
 
*옵셔널 바인딩과 사용
 
if let ret = nilReturnFunction() {
    print("실행 결과 : \(ret)")
}
cs

 

- 옵셔널 타입의 파라미터

*호출 시 : 파라미터에 nil 대입 가능
 
let ret2 = append(str: "Welcome", num: nil)
 
*함수 구현 시 : nil 검사 필요
 
func append(str: String, num val: Int?) -> String {
    guard let str2 = val else {
        return str
    }
    return str + String(str2)
}
cs

 

#강제 언래핑 사용

*nil반환 함수 호출 시
 
func nilReturnFunction() -> Int? {
    return nil
}
let ret : Bool = nilReturnFunction()!
cs

 

- 함수 내 함수

#함수 내부에 함수 정의

*함수 외부에서 사용 불가
 
func outerFunc() {
    func innerFunc() {
        print("Inner Function works")
}
 
    print("Outer Function works")
    innerFunc()
}
 
outerFunc()
innerFunc() // 외부에서 호출 불가
cs