>

Swift 4.1과 같습니다. flatMap  더 이상 사용되지 않습니다. 그러나Swift 4.1 compactMap 에는 새로운 방법이 있습니다  어느 것도 같은 일을하고 있습니까? flatMap 와 함께  컬렉션의 각 개체를 변형 한 다음 0이 아닌 항목을 제거 할 수 있습니다.
flatMap처럼

let array = ["1", "2", nil] 
array.flatMap { $0 } // will return "1", "2"

콤팩트 맵처럼

let array = ["1", "2", nil] 
array.compactMap { $0 } // will return "1", "2"

compactMap  같은 일을하고 있습니다.

이 두 방법의 차이점은 무엇입니까? Apple이 왜 메소드의 이름을 바꾸기로 결정 했습니까?


  • 답변 # 1

    flatMap 의 세 가지 변형이 있습니다 . Sequence.flatMap(_:) 의 변형  선택적 값을 반환하는 클로저를 수락하면 더 이상 사용되지 않습니다. flatMap(_:) 의 다른 변종  시퀀스와 옵션 모두에서 그대로 유지됩니다. 제안서에 설명 된 이유는 오용 때문입니다.

    더 이상 사용되지 않는 flatMap  새로운 기능 compactMap 에서 변형 기능이 동일합니다. .

    자세한 내용은 여기를 참조하십시오.

  • 답변 # 2

    Swift 표준 라이브러리는 flatMap 에 대한 3 개의 과부하를 정의합니다.  기능 :

    Sequence.flatMap<S>(_: (Element) -> S) -> [S.Element]  
    Optional.flatMap<U>(_: (Wrapped) -> U?) -> U?  
    Sequence.flatMap<U>(_: (Element) -> U?) -> [U] 
    
    

    마지막 과부하 기능은 두 가지 방법으로 오용 될 수 있습니다 :
    다음 구조체와 배열을 고려하십시오 :

    struct Person {
      var age: Int
      var name: String
    }  
    let people = [Person(age: 21, name: "Osame"), Person(age: 17, name: "Masoud"), Person(age: 20, name: "Mehdi")] 
    
    

    첫 번째 방법 : 추가 포장 및 포장 풀기 :
    people 에 포함 된 다양한 연령대의 사람들이 필요하다면  배열은 두 가지 기능을 사용할 수 있습니다 :

    let flatMappedAges = people.flatMap({$0.age})  // prints: [21, 17, 20]
    let mappedAges = people.map({$0.age})  // prints: [21, 17, 20] 
    
    
    이 경우 map  기능은 작업을 수행하고 flatMap 를 사용할 필요가 없습니다 둘 다 동일한 결과를 생성하기 때문입니다. 또한 flatMap의이 유스 케이스에는 쓸모없는 랩핑 및 언 랩핑 프로세스가 있습니다. 클로저 매개 변수는 리턴 된 값을 Optional로 랩핑하고 flatMap의 구현은 선택적 값을 리턴하기 전에 랩핑 해제합니다.

    두 번째 방법-컬렉션 프로토콜에 대한 문자열 준수 :
    people 에서 사람의 이름 목록을 가져와야한다고 생각하십시오  정렬. 다음 줄을 사용할 수 있습니다 :

    let names = people.flatMap({$0.name}) 
    
    

    4.0 이전의 빠른 버전을 사용했다면 변환 된 목록이 나타납니다

    ["Osame", "Masoud", "Mehdi"] 
    
    

    하지만 최신 버전에서는 String   Collection 에 따릅니다  프로토콜, 그래서 flatMap() 의 사용법  세 번째 함수 대신 첫 번째 과부하 함수와 일치하며 변환 된 값의 결과를 평평하게합니다.

    ["O", "s", "a", "m", "e", "M", "a", "s", "o", "u", "d", "M", "e", "h", "d", "i"]
    
    

    결론 : flatMap ()의 세 번째 오버로드가 더 이상 사용되지 않습니다
    이러한 오용으로 인해 swift 팀은 세 번째 과부하를 flatMap 함수에 더 이상 사용하지 않기로 결정했습니다. 그리고 Optional 를 처리 해야하는 경우에 대한 솔루션 지금까지 compactMap() 라는 새로운 기능을 도입했습니다  예상 결과를 제공합니다.

  • 이전 vue.js - 단일 결과로 여러 결과를 표시하는 Lodash 기능
  • 다음 html - CSS 변수가 존재하는 경우에만 사용하는 방법?