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
같은 일을하고 있습니다.
- 답변 # 1
- 답변 # 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()
라는 새로운 기능을 도입했습니다 예상 결과를 제공합니다.
관련 자료
- python - var = fun ()과 var = fun의 차이점
- c - (int ret = 0;! ret&&ret! = 0)의 차이점
- security - ios - 제안 된 자격 증명과 신뢰를위한 url 자격 증명의 차이점
- NSObject에서 상속받은 클래스와 Swift에서 @objc로 표시된 클래스 사이에 차이점이 있습니까?
- 두 날짜 열의 차이를 계산하기위한 Excel 수식
- python - Pytesseract와 Tesserocr의 차이점은 무엇입니까?
- neural network - DNN에서 배치 표준을 적용하는 것과 가중치 및 바이어스 만 사용하는 것의 차이점은 무엇입니까?
- emacs - 구성표와 Elisp의 기능 평가의 차이점
- What is the difference between |+ and | - kubernetes yaml 정의의 파일에서 구성 맵을 작성할 때 | +와 |-의 차이점은 무엇입니까?
- python - slower () count ( "earth")와 supper () count ( "Earth")의 차이점은 무엇입니까?
- sql - 두 줄의 차이를 얻는 방법
- 배열 인덱싱과 사전의 차이점은 무엇입니까?
- rust - ʻimpl trait for t where t - trait2`와 ʻimpl trait for dyn trait2`의 차이점
- key - R의 함수 내에서 두 데이터 세트 간의 차이를 계산할 때 데이터 세트의 ID를 유지하는 방법
- android - 에뮬레이터와 물리적 장치로 프로그램을 실행하는 것의 차이점은 무엇입니까?
- database design - Postgresql에서 float와 numeric의 차이점은 무엇입니까?
- c++ - &table [0] [0]과&table의 차이점은 무엇입니까?
- algorithm - 구현의 차이점은 무엇입니까?
- sql - 존재하지 않는 인서트와 인서트의 성능 차이
- java - "매개 변수화 된 유형의 배열 (List [])"과"변수 유형의 배열 (T [])"의 차이점은 무엇입니까?
flatMap
의 세 가지 변형이 있습니다 .Sequence.flatMap(_:)
의 변형 선택적 값을 반환하는 클로저를 수락하면 더 이상 사용되지 않습니다.flatMap(_:)
의 다른 변종 시퀀스와 옵션 모두에서 그대로 유지됩니다. 제안서에 설명 된 이유는 오용 때문입니다.더 이상 사용되지 않는
flatMap
새로운 기능compactMap
에서 변형 기능이 동일합니다. .자세한 내용은 여기를 참조하십시오.