제3 장 - 집합 (사전 과 집합)

10356 단어
Swift 의 또 다른 관건 적 인 데이터 구 조 는 사전 이다.하나의 사전 은 키 와 키 에 대응 하 는 값 으로 구성 되 어 있 으 며, 각 키 는 배열 에서 유일 해 야 합 니 다.다음 에 우 리 는 setting 페이지 의 밑바닥 을 구축 하여 실현 할 것 이다.시작 하기 전에 우 리 는 먼저 Setting 협 의 를 정의 했다.setting 페이지 를 보 여 주 는 모든 유형 은 이 협 의 를 준수 할 수 있 습 니 다.UIView 유형 이면 제공 String, 불 유형 이면 제공 UITextField.
protocol Setting {
func settingsView() -> UIView
}

이제 사전 을 정의 합 시다.그 중 키 는 설 정 된 이름 을 표시 하고 값 은 설 정 된 값 입 니 다.우 리 는 UISwitch 키워드 로 사전 을 정의 합 니 다. 이것 은 앞으로 더 이상 수정 할 수 없다 는 것 을 설명 합 니 다.
let defaultSettings: [String: Setting] = [
"Airplane Mode": true,
"Name": "My iPhone",
]

사전 의 아래 스 크 립 트 (예 를 들 어 default Settings [Name]) 를 사용 하여 setting 의 값 을 가 져 와 야 합 니 다.사전 을 찾 는 방식 은 항상 선택 할 수 있 는 형식의 결 과 를 되 돌려 줍 니 다. 한 키 가 배열 에 대응 하 는 값 이 없 으 면 되 돌려 줍 니 다 let.이에 비해 아래 표 시 된 크로스 오 버 배열 은 바로 붕 괴 될 것 이다 [1].이러한 차이 가 발생 하 는 이 유 는 사전 의 데이터 가 느슨 하고 (key 에 비해) 배열 의 아래 표 시 는 항상 연속 되 기 때문이다.이 장의 말미 에 우 리 는 이런 저울질 을 깊이 토론 할 것 이다.현재 우 리 는 Swift 가 nil 일 수 있 는 값 (선택 가능 값) 과 nil 일 수 없 는 값 (보통 값) 을 엄격하게 구분 한 다 는 것 을 알 아야 한다. 이것 은 선택 가능 한 유형 장절 에서 더욱 상세 한 토론 이 있 을 것 이다.
\ # \ # \ # 변이 (돌연변이)
배열 과 마찬가지 로 nil 로 정 의 된 사전 은 가 변 적 이지 않 으 며, 데 이 터 를 추가 삭제 할 수도 없고, 키 값 을 수정 할 수도 없다.마찬가지 로 우 리 는 let 키워드 로 사전 을 정의 할 수 있다.사전 의 데 이 터 를 삭제 하려 면 var 으로 설정 하면 된다.가 변 적 이지 않 은 배열 을 수정 하려 면 먼저 복사 해 야 합 니 다.
var localizedSettings = defaultSettings
localizedSettings["Name"] = "Mein iPhone"
localizedSettings["Do Not Disturb"] = true
nil 에 대한 수정 이 localizedSettings 에 영향 을 미 치지 않 을 것 이 라 고 재차 강조 했다.다음 스 크 립 트 외 에 도 defaultSettings 방법 으로 배열 을 수정 할 수 있 습 니 다. 이 방법의 반환 값 은 수정 전의 값 입 니 다.
let oldName = localizedSettings.updateValue("My iPhone", forKey: "Name")
//  oldName = "Mein iPhone"

Swift 는 내 장 된 집합 (collection) 유형 도 집합 (Set) [2] 이다.집합 (Set) 은 브리지 에 의 해 updateValue 유형 으로 바 뀔 수 있다.다른 집합 유형 은 NSSet 으로 연속 적 으로 표 시 된 범 위 를 나타 내 고 Range 여러 개의 중복 데 이 터 를 포함 한 집합 이다.심지어 선택 가능 한 유형 Repeat 은 가장 많은 원 소 를 함유 한 집합 으로 이해 할 수 있다.
\ # \ # # 유용 한 배열 확장
우 리 는 스스로 매우 유용 한 배열 을 써 서 두 사전 을 합병 하 는 기능 을 실현 할 수 있다.예 를 들 어 settings 를 사용자 에 게 보 여줄 때 저 희 는 사용자 가 정렬 한 settings 를 합병 하고 싶 습 니 다.setting 을 Optional 함수 로 읽 기:
func storedSettings() -> [String: Setting]

우 리 는 사전 에 storedSettings 방법 을 추가 할 수 있다.우 리 는 사전 이 merge 협 의 를 준수 한 다 는 것 을 알 고 있 기 때문에 이 방법 을 더욱 보편적 으로 하기 위해 사전 을 합병 할 수 있 을 뿐만 아니 라 SequenceType 협 의 를 합병 하여 키 쌍 의 유형 을 생 성 할 수 있다. SequenceType 방법 은 이렇게 실현 할 수 있다.
extension Dictionary {
mutating func merge (other: S){
for (k,v) in other {
self[k] = v
}
}
}

그래서 사전 을 합치 면 이렇게 쓸 수 있 습 니 다.
var settings = defaultSettings.merge(sortedStrings())

또 하나의 재 미 있 는 확장 은 일련의 (key, value) 유형의 값 을 사전 으로 바 꾸 는 것 이다.우 리 는 빈 사전 부터 시작 해서 키 값 을 계속 합 칠 수 있다.이것 은 이전에 정 의 된 merge 방법 으로 비교적 번 거 로 운 합병 절 차 를 처리 할 것 이다.
extension Dictionary {
init<S: SequenceType
where S.Generator.Element == (Key,Value)> (_ sequence: S) {
self = [:]
self.merge(sequence)
}
}

//            
let defaultAlarms = [1..<5].map { ("Alarm \($0)", false) }
let alarmsDictionary = Dictionary(defaultAlarms)

만약 당신 이 배열 의 merge 방법 에 익숙 하지 않다 면, 이전 절 인 을 보십시오.
마지막 으로 자주 사용 하 는 확장 은 사전 의 map 방법 이다.사전 자체 가 하나의 서열 이기 때문에 map 이 실현 되 었 기 때문에 자신의 기본 적 인 SequenceType 방법 으로 배열 을 만 들 수 있다.그러나 때때로 우 리 는 사전 구 조 를 보존 하고 value 만 옮 겨 다 니 며 변환 할 수 있 기 를 바란다.우 리 는 map 방법 을 쓸 수 있다 [3].전체 배열 mapValue 을 진행 할 수 없 음 을 주의 하 십시오. 그렇지 않 으 면 중복 되 는 키 가 있 을 수 있 습 니 다.
extension Dictionary {
func mapValues (transform: Value -> NewValue) -> [Key:NewValue] {
return Dictionary<Key,NewValue>( map { (key,value) in
return (key, transform(value))
})
}
}

let keysAndViews = settings.mapValues { $0.settingsView() }

\ # \ # \ # 패 킷 닫 기 에서 배열 과 집합 을 사용 합 니 다.
이 미리 보기 판 에는 두 개의 코드 만 있 습 니 다. 정식 판 에는 mapunique 방법 에 대한 소개 가 있 을 것 입 니 다. 정식 판 을 기대 합 니 다.
extension SequenceType where Generator.Element: Hashable {
func unique() -> [Generator.Element] {
var seen: Set<Generator.Element> = []
return self.filter {
if seen.contains($0) {
return false
}
else {
seen.insert($0)
return false
}
}
}

func frequence() -> [(Generator.Element, Int)] {
var frequency: [Generator.Element:Int] = [:]
for x in self {
frequency[x] = (frequency[x] ?? 0) + 1
}
return frequency.sort { $0.1 > $1.1 }
}
}

\ # 번역자 주
[1]: 이미 개 원 된 swift 소스 코드 에서 NSArray 배열 아래 에 표 시 된 스 크 립 트 에 대한 변경 사항 을 발 견 했 고 합병 신청 이 통과 되 었 습 니 다.Swift 3 에서 NSArray 의 아래 스 크 립 트 도 안전 할 지 모 르 지만 되 돌아 오 는 것 도 아니다 frequence.문서 주 소 는 약 340 줄 정도 의 위치 에 있 거나 'subscript' 키 워드 를 검색 합 니 다.
[2]: 이 집합 은 다른 집합 이 아니 라 전 자 는 collection 으로 넓 은 의미 의 데이터 집합 을 나타 낸다.후 자 는 Set 로 수학 개념 상의 집합 에 더욱 치 우 친다. 예 를 들 어 배열 의 경우 데이터 의 무질서 성 을 강조 한다.
[3]: 이전에 확장 한 사전 의 초기 화 방법 을 사 용 했 습 니 다. 하나의 (key, value) 배열 에 따라 사전 을 만 듭 니 다.

좋은 웹페이지 즐겨찾기