@nickfalk는 올바른 방향으로 가고 있지만 더 잘할 수 있습니다. 그의 결과는 불행히도 [AnyObject]
을 반환합니다. 그러면 newFile
으로 전화 할 수는 없지만 나머지 부분은 꽤 얻을 수 있습니다.
원하는 것은 부분지도입니다. 즉, 하나의 lis 요소 중 일부 (그러나 전부는 아닐 수도 있음)를 매핑하고자합니다. 다른 목록으로 이동 (AnyObject
에서 File
까지 가능). 그래서 선택을위한 규칙과 매핑을위한 규칙이 있어야합니다. 옵션으로 합치 자. 이 함수를 호출 해 보겠습니다. f
. 그리고 그 형태는 다음과 같습니다
f: T->U?
그래서 아마도
U
에
T
변환합니다 마법 기능이있다. 우리는 그것과 매핑하고 싶습니다.
extension Array {
func partialMap<U>(f: T->U?) -> [U] {
var result = [U]()
for x in self {
if let u = f(x) {
result.append(u)
}
}
return result
}
}
그래서 지금 우리가 숨긴 모든 불쾌한 돌연변이와 var
를하고 이것 저것 아래로 깊은 우리는 그것을 볼 필요가 없습니다 여기서 쉽게 소리. 우리는 "무언가"에서 "어쩌면 다른 것"으로 매핑 함수를 사용하고 "맵핑 할 수있는 무언가"의 목록을 반환하는 함수를 가지고 있습니다.
이제 모든 좋은 불변 및 재사용 :이
let result = array.partialMap { ($0 as? NSDictionary).map(newFile) }
우와. 그 중간에 map
은 무엇입니까? 음, as?
은 NSDictionary?
을 반환합니다.map
옵션 인 경우 선택 사항이 None
이면 None
을 반환하고, 그렇지 않으면 값에 함수를 적용하고 Some
에 래핑합니다. 그래서이 모든 일은 AnyObject
이며 우리가 원한 것처럼 File?
을 반환합니다. 하나 partialMap
나중에 우리는 우리의 대답이 있습니다.
를? 그것을 더 짧게 만드시겠습니까? 귀하의 코드는 명확하고 읽기 쉽습니다. 당신의 논리를 이해하려고 시도한 후에 다른 개발자에게 더 열심히하지 마십시오. –
만약 그 배열이 사전의 배열이라면 왜 그렇게해야합니까? –
무엇을 확인하려고합니까? 'array'는 어떤 타입입니까? –