목록앱 개발/iOS (88)
나의 발자취
딕셔너리의 키는 hashable해야한다. = 유일성이 보장되어야한다. (내부적으로 순서대로 존재하지 않기때문에 유일성을 가진 매커니즘을 가져야지만 가능) 참고: 해쉬 스위프트의 기본 타입은 모두 hashable하다. (개발자 지정 타입은 hashable 하지 않음) = 해시함수에 input으로 쓰일 수 있는 타입이다. = 해시함수를 사용해서 유일한 값으로 변환이 가능하다. = 유효성을 보장하고 검색 속도가 빠르다(배열보다 훨씬 빠르다) 딕셔너리 타입 표기 // 단축문법 var words: [String: String] = [:] // 정식문법 let words1: Dictionary 딕셔너리 생성 let emptyDic1: Dictionary = [:] let emptyDic2 = Dictionary()..
1. 배열 (Array) 데이터를 순서대로 저장하는 컬렉션 (자동으로 순번 지정됨) 📌타입 표기 // 정식문법 let strArray1: Array = [] // 단축문법 let strArray2: [String] = [] 📌빈 배열 생성 let emptyArray1: [Int] = [] // 명시적. 하지만 타입을 지우면 컴파일러가 알 수가 없어서 에러가 나기때문에 하나라도 입력하면 타입추론 가능. let emptyArray2 = Array() // 괄호는 생성자를 의미함 let emptyArray3 = [Int]() 📌기본 기능 numsArray.count numsArray.isEmpty numsArray.contains(1) // 파라미터로 값을 전달 numsArray.randomElement() ..
일반적으로 함수 내에서 옵셔널 타입을 파라미터로 정할 때 파라미터 내에서 선언을 해주고 기본값을 설정해준다. 그 이유는 호출을 할 때 모든 아규먼트를 넣어서 쓰기가 귀찮기 때문..이다. func someting(with label: String, name: String? = nil) { print("\(label): \(name)") } someting(with: "Label") 일반적으로는 String? = nil (기본값까지 설정해서, 함수를 유연하게 사용하도록 함) 애플이 미리 만들어 놓은 함수/메서드에는 파라미터가 옵셔널타입과 기본값이 nil로 설정된 함수들이 많다는 것을 유의!
옵셔널 추출 네가지 1. 강제추출(Forced Unwrapping) (!) 값이 있다는 것이 확실할 때 사용 var str: String? = "안녕하세요" print(str!) nil일 때 forced unwrapping을 하면 에러가 난다. 2. if문으로 nil 아닌지 확인 후 강제로 벗기기 if str != nil { print(str!) } 3. 옵셔널 바인딩 (if let 바인딩) 만약 바인딩이 된다면, 특정 작업을 하겠다는 의미이다. if let s = str { // str에 있는 값이 s라는 상수에 바껴서 담긴다면(nil값이 아니라면). 만약 nil이라면 담기지 않는다! print(s) } str: Optional String s: String +실제 앱을 만들 때 guard let 바인..
우리가 타입을 선언하고 값이 없는 공간에 접근을 하면 에러가 발생한다. 예를 들어, var yourName: String // 선언 //yourName = "홍길동" // 값을 저장하지 않는다면.. print(yourName) // (만약 저장과정이 없다면) 메모리에 저장된 값이 없는데 접근 ===> 🔸"에러" 앱이 종료되게 된다. 그래서 물음표를 붙여줘서 에러가 나지 않도록 임시적인 타입을 담아두게 된다. -> 이것이 옵셔널 var yourName: String? // 옵셔널 print(yourName) // nil nil : 값이 없음을 표현하는 키워드. 다른 언어에서는 null이 있다. 이는 값이 없음을 나타낸다. 그러나 스위프트에서는 실제 값이 없는 것이 아니다. 값이 없을 수 있다는 것을 알려주..
print(_ items: Any..., separator: String = " ", terminator: String = "\n") _: 와일드카드 패턴; argument label을 사용하지 않음. separator: 글자를 분리하는 기본값 terminator: 글자를 끝내는 기본값
guard(감시하다) : 조건이 맞는지 감시한다. 사용 이유 if문을 사용할 때, 조건이 여러개가 된다면 들여쓰기가 많아져서 가독성이 떨어진다는 단점이 있다. 또한 여러개의 옵셔널 타입을 안전하게 언래핑할 수 있다. 코드의 영역이 변경되지 않고, guard문에서 선언된 변수를 아래문장에서 사용 가능하기 때문이다. 불만족하는 조건을 사전에 걸러내는 조건문 먼저 감시를 해서 조건을 만족하지 않으면 else문이 실행이 되며 종료시킨다. (early exit) (종료 조건; 함수 내애서는 return / true. 반복문에서는 break / continue. ) 조건을 만족하면 else 문 밑의 코드들을 실행한다. else문이 먼저 등장하는 if문이라고 생각하면 쉽다. 형태 guard password.count..
함수 내의 파라미터는 기본적으로 값타입이고(복사되어서 전달) 임시상수이기 때문에 변경이 불가하다. 이때 inout 키워드를 사용하면 참조로 전달하게 된다. 파라미터의 복사본이 전달되는 것이 아니라 원본의 주소가 전달된다. (내부적으로 copy-in copy-out 매커니즘이 실행된다.) 변수를 직접 넣었다가 뺀다고 생각하면 쉽다. 정의 하는 방법은 함수 파라미터를 할 때 파라미터 타입 앞에 inout 키워드를 추가한다. func swapNumbers(a: inout Int, b: inout Int) { ... } 실행 방법 swapNumbers(a: &num1, b: &num2) 위에서 inout 키워드로 선언하면 아래에서 호출할 때 자동으로 되지만, 변수를 전달할 때 & 기호를 꼭 붙어야 한다.(원본이..