일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Mac git 사용자 갱신
- YB
- iOS스토리보드 없이 개발
- 지원 후기
- iOS 커스텀 폰트
- iOS Tabbar Code
- ios
- 솝트
- iOS Custom Tabbar in code
- 네비게이션 모달로 띄우기
- iOS 커스텀 폰트 사용
- iOS코드베이스
- 면접 후기
- iOS Tabbar programmatically
- 네비게이션 모달
- 네비게이션뷰컨 모달로 띄우기
- iOS Tabbar
- sopt
- iOS Custom Tabbar
- 28기
- iOS파트
- iOS네비 모달
- iOS Custom Font 사용
- iOS 네비게이션 뷰컨 모달
- 대학생 IT동아리
- iOS Custom Font
- 동아리
- iOS코드베이스 개발 세팅
- NavigationViewController를 모달로 띄울 때
- 맥 깃 오류 해결법
- Today
- Total
지츄로그
[iOS] 부스트코스 스위프트 문법 정리 #1 본문
부스트코스 스위프트 문법 강의를 듣고 배운 내용에 대해서 정리해보려고 합니다.
문법 강의를 들으면서 이미 알고 있었던 내용들과 새로 알게 된 내용을 함께 정리해보려고 합니다.
Playground 란?
Playground는 Xcode 6부터 지원되는 기능으로 Xcode 내에서 프로젝트에서 빌드를 하는 방식이 아닌, 일반 에디터에 코드를 작성하더라도 간단하게 결과물을 확인할 수 있는 기능을 가지고 있습니다.
Playground를 활용해 간단하게 코드를 작성해보고 어떤 결과가 나오는지 바로바로 확인이 가능합니다!
1. 이름짓기, 콘솔 로그, 문자열 보간법
01. 이름 짓기
네이밍하는 방법에는 여러 가지가 있지만(lowerCamelCase, UpperCamelCase, Hungarian Notation, snake_case 등), 구분하기 쉽도록 사람들이 규칙에 이름을 붙여서 부르고 있습니다.
Swift에서는 lower/Upper Camel Case를 사용합니다.
함수/메소드/변수/상수 에서는 lowerCamel Case를,
타입(클래스, 구조체, 열거형, Extension)에서는 UpperCamelCase를 사용합니다.
02.콘솔 로그
Swift에서는 콘솔 로그를 출력할 때 2가지 방법을 이용합니다.
print, dump를 이용합니다.
print는 간단한 문자열, 데이터 등을 출력할 때 사용하고,
dump는 인스턴스의 자세한 설명을 출력할 때 사용합니다.
03.문자열 보간법
문자열 보간법 이란?
보간법이란 두 점을 연결하는 방법이라는 뜻을 가지고 있습니다.
문자열 보간법은 문자열을 이어나가는 방법을 의미하는 것입니다.
문자열 보간법의 정확한 정의는 String Interpolation이라는 뜻으로, "변수 또는 상수 등의 값을 문자열 내에 나타내는 방법"입니다.
let name: String = "jisoo"
print("My name is \(name)"))
예시처럼 문자열 중간에 변수를 같이 출력하고 싶다면 다음과 같이 문자열 중간에\(변수 이름)을 넣어서 문자열을 완성하면, 자연스럽게 하나의 문자열처럼 출력이 됩니다.
2. 상수와 변수
변수는 변할 수 있는 값을 의미합니다. -> var이라는 키워드를 사용합니다.
상수는 고정된 값을 의미합니다. -> let이라는 키워드를 사용합니다.
상수/변수 선언 방법은 다음과 같습니다.
상수라면 let (키워드)(이름) : (타입) = 값
변수라면 var (키워드)(이름) : (타입) = 값
var number : Int = 1
var point : Float = 1.5
let name : String = "Jisoo"
변수로 선언해두고 값이 변경되는 부분이 없다면 Xcode가 "변하는 부분이 없는데 왜 let 이 아니라 var로 선언했어?"라고 물어봅니다.
이런 변수들은 상수로 고쳐주면 됩니다.
3. 기본 데이터 타입
Bool 타입은 Boolean의 약자로, true / false를 담을 수 있습니다.
하지만 다른 언어와는 다르게, Bool 타입 변수에 0과 1을 대입할 수 없습니다.
Bool 타입 변수에 true / false로 떨어지는 연산의 결과값을 넣을 수도 있습니다.
Int 타입은 Integer 의 약자로, 정수 타입의 데이터를 모두 담을 수 있습니다.
정수 범위를 벗어나는 숫자(ex 100.1)을 대입하는 경우 컴파일 오류가 발생합니다.
기본적으로 64비트 정수형의 데이터 타입입니다.
UInt 타입은 Unsigned Integer의 약자로, 양의 정수 타입의 데이터를 모두 담을 수 있습니다.(0 포함)
하지만 Swift는 타입에 매우 엄격한 편이라, Int 변수를 UInt 변수에 대입하면 컴파일 에러가 발생하는 점을 유의해주세요!
기본적으로 64비트 양의 정수형의 데이터 타입입니다.
Float 타입은 32비트 실수 데이터를 담을 수 있으며, Double 타입은 64비트 실수 데이터를 담을 수 있는 타입입니다.
서로 다른 타입끼리는 바로 대입을 할 수 없으니 이 점은 꼭 유의해야 합니다.
Character 타입은 문자를 담을 수 있는 타입입니다. 유니코드로 된 데이터라면 모두 담을 수 있지만 "문자열"은 대입이 불가능합니다. 컴파일 에러가 발생합니다. 오로지 '문자'만 가능합니다.
String 타입은 문자열을 담을 수 있는 타입입니다. 문자열끼리 더해서 새로운 문자열을 만드는 것도 가능합니다. 하지만 문자(Character) 형 과는 결합이 되지 않으니 주의해야 합니다.
String 타입은 여러 줄을 넣을 수 있도록 지원합니다. 여러줄을 넣고 싶다면 """을 처음과 끝에 달아주면 됩니다. 유의해야 할 점은, 겹 따옴표(""")를 기준으로 줄 바꿈 하면 인식을 못해서 에러가 납니다.
4. Any, AnyObject, Nil
Swift에서 특이하게 가지고 있는 데이터 타입이 있습니다.
기존에 살펴봤던 타입에서는 다른 타입끼리는 대입이 불가능했지만 Any, AnyObject는 다릅니다.
Any, AnyObject에는 모든 데이터 타입 / 모든 클래스의 인스턴스를 넣을 수 있습니다.
Any 에는 다양한 데이터 타입의 값이, AnyObject 에는 모든 클래스의 인스턴스가 대입이 가능합니다.
Any는 다양한 데이터 타입의 값을 수용하는 것이 가능합니다. 하지만 Any 데이터 형을 대입하려면 반드시! 형 변환이 필요합니다.
Any Object는 Any 보다는 좁은 의미로, 클래스의 인스턴스라면 모두 대입할 수 있습니다.
클래스의 인스턴스 값만 대입 가능하기 때문에 일반 데이터 형을 대입하면 에러가 발생합니다. 이럴 경우에 Any를 사용해야 합니다.
다양한 타입의 값들을 Any, AnyObject에 넣었다면, 직접 이 변수를 사용하기 위해서는 사용하려고 하는 타입으로 형 변환을 꼭 해줘야 합니다. 사실 Swift는 타입에 엄격하고 안정성을 추구하는 언어라서 Any, AnyObject로 선언된 변수의 값을 가져다 쓰려면 매번 타입 확인 및 변환을 해줘야 하며 예기치 못한 오류가 생길 수 있기 때문에 해당 변수에 무슨 값이 올지가 정해졌다면 타입은 명시하는 것이 좋습니다.
nil은 특정 타입이 아니라 '없음'을 의미하는 스위프트 키워드입니다.
다른 언어들의 NULL, Null, null 등과 유사한 표현입니다. (Object C에서의 nil은 클랙스 객체만을 가리켜서 없을 때 사용합니다.)
-> 특정 타입에 대한 값의 부재를 의미합니다.
Any 나 Any Object에는 nil이 대입이 불가능합니다. Any, AnyObject에는 데이터 타입과 클래스 인스턴스만 받기 때문에 nil은 데이터 타입이 아닌, 없음을 의미하는 키워드 이기 때문입니다.
nil은 optional 변수에만 대입이 가능한 키워드입니다.
5. 컬렉션타입(Array, Dictionary, Set)
Swift에서는 데이터의 집합(컬렉션)을 3가지 형태로 제공합니다.
Array, Set, Dictionary 총 3가지 형태로 나뉘게 됩니다.
Array는 "순서가 있는" 리스트 컬렉션이며, 인덱스(순서)를 통해 접근을 할 수 있습니다.
Array에서는 다양한 리터럴문법을 활용할 수 있어서 표현 방법이 정말 다양합니다.
var integers: Array<Int> = [Int]()
var integers: Array<Int> = []
var integers: [Int] = Array<Int>()
var integers: [Int] = [Int]()
var integers: [Int] = []
var integers = [Int]()
Array에서는 다양한 메소드를 지원합니다. 많이 사용되는 몇가지 메소드에 대해서 알아보겠습니다.
Array에 원소를 담고 싶다면 Array이름.append(원소)
Array에 원소가 있는지 확인해보고 싶다면 Array이름.contains(원소) 있다면 true 없다면 false 로 반환됩니다.
Array에 원소를 지우고 싶다면 Array이름.remove(at: (지우고 싶은 인덱스 번호))
Array의 마지막 원소를 지우고 싶다면 Array이름.removeLast()
Array의 모든 원소를 지우고 싶다면 Array이름.removeAll()
Array의 원소 갯수를 알고 싶다면 Array이름.count()
Array의 해당 원소가 몇번째 index인지 알고 싶다면 Array이름.firstIndex(of : 원소) / Array이름.lastIndex(of: 원소)
Array의 원소를 교체하고 싶다면 Array이름[index] = 원소
Array의 첫번째/마지막의 값을 알고 싶다면 Array이름.first / Array이름.last
Array의 특정 index값을 알고 싶다면 Array이름[index]
Dictionary는 Key와 Value 쌍으로 이루어진 데이터 컬렉션입니다.
Array와 가장 큰 차이점은 순서가 절대 보장되지 않습니다!
순서를 보장받기 위해서는 Dictionary를 사용하면 안됩니다. 대신, Key값으로 데이터를 접근할 때 Dictionary 형태는 유용합니다.(전화번호부처럼) (전화번호부를 사용 할 때, 사람의 이름으로 검색하지만 전화번호부의 순서로 검색하지 않는 것 처럼)
Array와 마찬가지로 Dictionary도 선언할 수 있는 다양한 리터럴 문법들이 존재합니다.
var dic : [Int : String] = [:]
var dic2 : [Int : String]()
var dic3 : Dictionary = [Int:String]()
var dic4 : Dictionary<Int, String> = Dictionary<Int,String>()
위에서는 선언만 했지만, 선언과 동시에 초기화도 가능합니다.
Key 값을 알고 있다면 Value를 수정할 수 있습니다.
var dic : [Int : String] [1:"jisoo", 2:"swift", 3:"iOS"]
dic.updatevalue("fun", forkey: 3)
print(dic) // [1:"jisoo", 2:"swift", 3:"fun"]
dic[3] = "iOS"
print(dic) // [1:"jisoo", 2:"swift", 3:"iOS"]
Key, Value 값을 통해 새로운 데이터가 추가가 가능합니다.
var dic : [Int : String] = [1:"jisoo", 2:"swift", 3:"iOS"]
dic.updateValue("View", forkey:4)
print(dic) // [1:"jisoo", 2:"swift", 3:"iOS", 4:"View"]
dic[8] = "!!"
print(dic) // [1:"jisoo", 2:"swift", 3:"iOS", 4:"View", 8:"!!"]
Dictonary의 값에 접근할 때는 key 값을 통해 접근합니다.
딕셔너리 이름[키 값]
var dic : [Int : String] = [1:"jisoo", 2:"swift", 3:"iOS"]
print(dic[1]!) // jisoo
print(dic[2]!) // swift
print(dic[3]!) // iOS
print(dic3["iOS"]) // nil
특이한 점은 dic[1]! 처럼 뒤에 !가 붙게 되는데, Swift입장에서는 이 Key 값에 대한 Value가 있는지 없는지를 모르기 때문에, Optional형태로 반환합니다. 따라서 값을 사용할 때에는 !(언래핑)을 사용해 값을 꺼내옵니다.
Dictionary의 값을 삭제할 때에도 key 값을 통해 접근합니다.
딕셔너리이름.removeValue(forkey : 키값)
딕셔너리이름.removeAll()
dic = [1:"jisoo", 2:"swift", 3:"iOS", 4:"View", 5:"Hello"]
dic.removeValue(forkey : 5)
print(dic) // [1:"jisoo", 2:"swift", 3:"iOS", 4:"View"]
dic.removeAll() // Dictionary의 모든 Key와 Value를 삭제
print(dic) // [:]
Set은 순서가 존재하지 않고, 멤버가 유일한 것을 보장하는 데이터 컬렉션 타입입니다.
예전에 수학시간에 배웠던 집합과 개념이 동일합니다.
// 빈 Int Set 생성
var integerSet: Set<Int> = Set<Int>()
integerSet.insert(1)
integerSet.insert(100)
integerSet.insert(99)
integerSet.insert(99)
integerSet.insert(99)
print(integerSet) // [100, 99 ,1]
print(integerSet.contains(1)) // true
print(integerSet.contains(2)) // false
integerSet.remove(100)
integerSet.removeFirst()
print(integerSet.count) // 1
원소 삽입, 삭제, 갯수의 메소드는 Array와 동일합니다. 대신 index를 통해 접근하는 방식은 Set에서 순서 개념이 없기 때문에 불가능합니다.
6. 함수 기본
Swift에서는 함수를 다음과 같은 형태로 선언합니다.
func 함수이름(매개변수1이름 : 매개변수1타입, 매개변수2이름 : 매개변수2타입 ...) -> 반환타입 {
/* 함수 구현부 */
return 반환값
}
만약 함수의 반환값이 없다면, Void 형태로 반환하거나 생략이 가능합니다.
func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 ...) -> Void {
/* 함수 구현부 */
}
func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 ...){
/* 함수 구현부 */
}
반대로 매개변수가 없는 경우에는 그냥 ()로 비워두면 됩니다.
func 함수이름() -> 반환타입 {
/* 함수 구현부 */
return 반환값
}
// 예)
func maximumIntegerValue() -> Int {
return Int.max
}
만약 매개변수와 반환값이 모두 없는 경우에는 모두 비워서 간결하게 표기하면 됩니다.
func 함수이름() -> Void {
/* 함수 구현부 */
}
//또는
func 함수이름() {
/* 함수 구현부 */
}
// 함수 구현이 짧은 경우
// 가독성을 해치지 않는 범위에서
// 줄바꿈을 하지 않고 한줄에 표현해도 무관합니다
func hello() { print("hello") }
선언해둔 함수를 호출하고 싶다면 선언해둔 형식에 맞춰 호출하면 됩니다.
func sum(a: Int, b: Int) -> Int {
return a + b
}
sum(a: 3, b: 5) // 8
'iOS 개발자가 되어보자 > 부스트코스' 카테고리의 다른 글
[iOS] Navigation ViewController을 Modal로 띄우고 싶을 때 (0) | 2021.08.16 |
---|