반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • 구축
    • ios
    • Android
    • xcode
    • map
    • 타입
    • 프로그래밍
    • 프로그래머스
    • Java
    • 개발
    • JSP
    • swfit
    • 공부
    • reduce
    • IT
    • 예제
    • 코딩테스트
    • kotlin
    • swift
    • level1

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    Swift 클로저
    Language/Swift

    Swift 클로저

    2021. 3. 11. 20:57
    반응형

    Closures입니다. closer 아닙니다!! ㅎㅋㅋ

     

     참조 타입인 클로저란 코드의 블럭을 뜻합니다.

    자세히 설명하자면, 코드안에서 전달되어 사용할 수 있는 로직을

    가진 코드의 코드의 블럭이며 {}로 구분됩니다.

    일급 시민 취급이라 전달인자 및 변수, 상수들으로 저장, 전달이 가능합니다.

    함수는 클로저의 일종으로 이름이 있는 클로저라고 생각하면 된다고 합니다.

    • 전역 함수 : 이름이 있고 어떤 값도 캡쳐하지 않는 클로저
    • 중첩 함수 : 이름이 있고 관련한 함수로 부터 값을 캡쳐 할 수 있는 클로저
    • 클로저 표현 : 경량화 된 문법으로 쓰여지고 관련된 문맥(context)으로부터 값을 캡쳐할 수 있는 이름이 없는 클로저

    Swift에서 클로저는 다음과 같은 내용을 포함해 최적화되어 있습니다.

    1. 문맥(context)에서 인자 타입(parameter type)과 반환 타입(return type)의 추론
    2. 단일 표현 클로저에서의 암시적 반환
    3. 축약된 인자 이름
    4. 후위 클로저 문법

     

    기본 형태

    {
    	(매개변수 목록) -> 반환타입 in
    		실행 코드
    }

     

    예제

     sum 이라는 함수에 클로저를 할당하는 예제입니다.

    let sum : (Int, Int) -> Int {
    	(a: Int, b: Int) in 
    		return a + b
    }
    
    let result: Int = sum(3, 9)
    print(result)  // 12

     

    함수의 전달인자로써의 사용

     클로저는 함수의 전달인자로 많이 사용됩니다.

    내부에서 원하는 코드블럭을 실행할 수 있습니다.

    클로저를 함수의 전달인자로 사용해 사칙연한을 하는 예제입니다.

    let add: (Int, Int) -> Int
    	add = { (a: Int, b: Int) in
    		return a + b
    }
    let sub: (Int, Int) -> Int
    	sub = { (a: Int, b: Int) in
    		return a - b
    }
    let div: (Int, Int) -> Int
    	div = { (a: Int, b: Int) in
    		return a / b
    }
    let mul: (Int, Int) -> Int
    	mul = { (a: Int, b: Int) in
    		return a * b
    }
    
    func calculate (a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
    	return method(a, b)
    }
    
    var calc: Int
    calc = calculate (a: 8, b: 4, method: add)
    print(calc) //12
    calc = calculate (a: 8, b: 4, method: sub)
    print(calc) //4
    calc = calculate (a: 8, b: 4, method: div)
    print(calc) //2
    calc = calculate (a: 8, b: 4, method: mul)
    print(calc) //32
    
    //함수 호출시 클로저로 상수/변수 전달하기
    var clac_add = calculate (a: 8, b: 4, method: { (num1: Int, num2:  Int) -> Int in
    	return (num1 + num2)
    })
    print(clac_add) //12

     

    다양한 클로저 표현들

     클로저 매개변수를 갖는 함수와 결과값을 저장할 변수를 먼저 선언하겠습니다.

    func calc(a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
    	return method(a, b)
    }
    
    var result: Int

     

    후행 클로저

     클로저가 함수의 마지막 전달인자라면, 마지막 매개변수 이름을 생략하고

    함수 소괄호 외부에 클로저를 위치시킬 수 있습니다.

    /*
    기존에 사용했던 함수
    var clac_add = calculate (a: 8, b: 4, method: { (num1: Int, num2: Int) -> Int in
    	return (num1 + num2)
    })
    */
    result = calc(a:4, b:5) { (num1: Int, num2: Int) -> Int in
    	result num1 + num2
    }
    
    print(result) //9

     

    반환타입 생략

     calc의 반환값이 Int임이 명시되어 있으므로, 반환타입은 생략가능 합니다.

    result = calc(a: 4, b: 5, method: { (num1: Int, num2: Int) in
        result num1 + num2
    })
    
    // 후행클로저
    result = calculate(a: 4, b: 5) { (num1: Int, num2: Int) in
        return num1+ num2
    }
    
    print(result) //9

     

    이름 인자 축약

     클로저의 매개변수 이름을 필요하다면 단축 인자이름을 활용할 수 있습니다.

    단축 인자이름은 언급된 매개변수의 순서대로 $0, $1, $2, $3...로 표현됩니다.

    result = calc(a:4, b:5, method:{
    	return $0 + $1
    })
    
    //후행 클로저에 적용
    result = calc(a:4, b:5) {
    	return $0 + $1
    }
    
    print(result) //9

     

    암시적 반환

    클로저의 반환값이 있다면, 클로저 마지막 줄의 결과는 암시적으로 반환값으로 취급합니다.

    result = calc(a:4, b:5, method:{ $0 + $1 })
    
    //후행 클로저에 적용
    result = calc(a:4, b:5) { $0 + $1 }

     


     

    함수로 구현

    func add(_ num1: Int, _ num2: Int)-> Int{
    	return num1 + num2
    }
    var result = add(3,4)
    print(result) //7

    클로저로 구현

    func add(a: Int, b: Int, method: (Int, Int) -> Int) -> Int{
    	return method(a, b)
    }
    var result: Int
    
    //축약 전의 클로저
    result = add(a: 3, b: 4, method: { (num1: Int, num2: Int) -> Int in
        return num1 + num2
    })
    print(result) //7
    
    //축약 후의 클로저
    result = add(a: 3, b: 4) { $0 + $1 }
    print(result) //7

     


    공부하는데 도움을 준 사이트

     

    전반적인 공부 가이드라인

    yagom.net

     

    야곰닷넷 - yagom.net

    iOS 개발자들의 놀이터, 배움터, 모임터, 기록보관소 야곰닷넷입니다.

    yagom.net

    공식 스위프트 언어 가이드 번역 사이트

    jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures

     

    클로저 (Closures)

     

    jusung.gitbook.io

     

    클로저 추가 참고

    seorenn.blogspot.com/2014/06/swift-closures.html

     

    Swift - 클로져(Closures)

    iOS 및 macOS 용 앱 개발, Emacs, Vim, Python 위주로 다루는 Seorenn 개인 블로그

    seorenn.blogspot.com

     

    클로저 추가 참고2

    medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-closure-aa401f76b7ce

     

    반응형

    'Language > Swift' 카테고리의 다른 글

    Swift 인스턴스의 생성과 소멸  (0) 2021.03.12
    Swift 프로퍼티 타입들  (0) 2021.03.12
    Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리]  (0) 2021.03.11
    Swift 사용자 정의 타입 - enum  (0) 2021.03.11
    Swift 사용자 정의 타입 - Class  (0) 2021.03.11
      'Language/Swift' 카테고리의 다른 글
      • Swift 인스턴스의 생성과 소멸
      • Swift 프로퍼티 타입들
      • Swift 사용자 정의 타입 - 값타입과 참조 타입 [추가정리]
      • Swift 사용자 정의 타입 - enum
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바