- Optional
- 값이 존재할 수도 있는 상황에서 optional를 사용한다.
- optional의 의미
- 값이 있고 그 값이 x와 같다.
- 값이 없다.
- optional가 값이 있다는 것을 확신하면 마지막에 느낌표를 붙여서 값에 접근할 수 있다.
- !: 값이 존재함을 확신할 수 있다는 의미
- forced unwrapping
- optional binding
- if let abc = possible.toInt()
- possible.toInt가 리턴한 optional int값이 값을 가지고 있다면 새로운 상수 abc의 값을 그 값으로 한다.
- forced unwrapping이 불필요 = ! 쓸 필요 없음
- Implicitly Unwrapped Optionals
- 프로그램 구조적으로 항상 값을 가질 때 수시로 !로 unwrapping해줄 필요 없이 값 지정 후 선언해주는 것
- Q. 그럼 일반 상수와의 차이는 뭘까?
- nil을 지정할 수 있는지 여부
- String! 사용
- 클래스 초기화 과정에서 사용
- 클래스의 initialize 과정에서 property를 선언할 때는 값을 지정할 수 없으니까 (외부에서 받으므로..)
- @see Unowned References and Implicitly Unwrapped Optional Properties
- 사용하면서 forced unwrapping을 해줄 필요가 없다.
- Assertion
- 조건이 false가 될 수 있지만 코드 실행을 위해서는 반드시 true여야 하는 곳에서 사용
- An integer subscript index is passed to a custom subscript implementation, but the subscript index value could be too low or too high.
- A value is passed to a function, but an invalid value means that the function cannot fulfill its task.
- An optional value is currently nil, but a non-nil value is essential for subsequent code to execute successfully.
- 다음에서 발췌: Apple Inc. ‘The Swift Programming Language.’ iBooks. https://itun.es/kr/jEUH0.l
- Operator
- 할당 연산자 = 는 그 값을 반환하지 않음. 따라서 if a = 5 {} 는 유효하지 않음
- 산술 연산자는 값이 오버플로우 되는 것을 허락하지 않음
- 오버플로우 시에 사용할 수 있는 overflow operator가 존재
- &+, &-, &*
- %는 나머지를 의미
- i++ 보다는 ++i를 추천. i를 변경하고 결과를 반환한다는 일반적으로 예상되는 동작을 수행하기 때문
- a…b : b 포함
- a..b : b 제외
- String
- value type: 함수나 메소드에 전달될 때 복사됨
- count() : 글자수 세기
- extended grapheme cluster로 인해 e위에 `가 있는 글자거나 한글이 초,중,종성의 각각의 코드로 이루어져 있어도 한 글자로 센다. (ㄱ,ㅏ,ㄴ 코드를 합친 것을 한 글자로. 물론 '간'에 대한 코드도 존재)
- 이런 이유로 긴 문자열에서 count를 실행하면 모든 글자를 돌게 된다.
- 마찬가지 이유로 NSString.length의 값과 count의 결과가 달라질 수 있다.
- String은 integer를 바로 index로 사용할 수 없다.
- String.startIndex, String.endIndex
- 빈 경우 두 값은 같다.
- endIndex는 마지막 문자의 index가 아니라 그 다음 index를 나타냄
- advance(start: n:): 시작 지점부터 n번째의 index
- 함수들
- indicies(_:): range 생성
- insert(_:atIndex:): index에 글자 삽입
- splice(_:atIndex:): 특정 index에 문자열 삽입
- removeAtIndex(_:): 특정 index의 글자 제거
- removeRange(_:): 특정 범위의 문자열 제거
- 비교
- extended grapheme cluster로 구성된 글자든 한 코드로 된 글자든 표현하는 모습이 같으면 글자를 구성하는 코드가 달라도 같은 글자(문자열)이다. (canonical equivalent)
- 비교시에는 locale에 따라 달라지지 않는다. (not locale-sensitive)
- Collection
- Array
- Array<Type>, Type[]: 후자를 추천
- count property로 배열에 포함된 값의 갯수를 확인
- 함수들
- isEmpty로 count가 0 여부 확인
- append: 배열 마지막에 추가
- += [ ]: 배열 마지막에 추가
- insert(atIndex:): 특정 index에 값 추가
- removeAtIndex(_:): 특정 index의 값 제거
- removeLast()
- for-in
- enumerate
- Set
- Set<Type>
- count property로 갯수 확인
- 함수들
- insert(_:)
- remove(_:)
- removeAll()
- contains(_:)
- for-in
- 순서가 없으므로 특정한 순서에 따라 탐색하려면 sorted 사용
- set 함수들
- union(_:): 합집합
- subtract(_:): 공통된거 빼기
- intersect(_:): 교집합
- exclusiveOr(_:): 두 set중 공통만 제외
- ==: 동일한지
- isSubsetOf(_:)
- isSupersetOf(_:)
- isStrictSubsetOf(_:), isStrictSupersetOf(_:) : superset이거나 subset인데 같지는 않은
- isDisjointWith(_:): 공통 값 있는지
- set에 저장되는 타입은 hashable 해야 함
- Dictionaries
- Dictionary<Key, Value>
- [Key: Value]
- Key는 hashable 해야 함
- count property로 갯수 확인
- 함수들
- updateValue(_:forKey:): 옛날 값 반환 (optional)
- removeValueForKey(_:)
- for-in
- 순서를 지정해서 탐색하려면 sorted 사용
- control flow
- for-in
- for index in 1…5
- index는 상수, 루프 돌 때마다 초반에 자동으로 값이 지정, let 불필요
- switch
- fallthrough
- 여러 case에 매치할 경우 첫 번째 매치만 실행됨
- case에 let, var를 사용하여 임시 변수로 만들 수 있음
- where: case let (x, y) where x == y :
- case내에서 또 조건을 세분화할 수 있음
반응형