본문 바로가기

Programming

SWIFT UI study #1 기초 문법

이번 포스팅은 야곰님의 swift 기초문법강좌 정리입니다.
저의 개인공부를 위한 간단한 내용 위주의 정리이니 자세한 설명이 필요하신 분들은 아래의 링크를 참조해주세요.
https://www.youtube.com/watch?v=2n-fSlW-jts&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy

SWIFT: 함수형 프로그래밍

1. 콘솔로그
print: 단순 문자열 출력
dump: 인스턴스의 자세한 property까지 출력함
문자열 보간법: print("Hi, I'm \(age+2) years old") 와 같이 \()를 사용함.

2. 상수, 변수
상수의 선언: let
변수의 선언: var
아래와 같이 선언
let or var 이름: 타입 = 값
값의 타입이 명확하다면 타입 생략 가능
let or var 이름 = 값
선언 후 나중에 값 할당 시에는
let or var  이름: 타입

3. 기본 데이터 타입 (SWIFT는 데이터 타입에 매우 엄격함)
Bool: true or false
Int: 64bit 정수
UInt: 64bit 양의 정수
Float: 32bit 부동소수타입
Double: 64bit 부동소수타입
Character: UNICODE로 표현가능한 모든 문자 가능, 이모티콘도 가능.
String: 문자열

4. Any, AnyObject, nil
Any: Swift의 모든 타입을 지칭하는 키워드
AnyObject: 모든 클래스 타입을 지칭하는 프로토콜
nil: 없음을 의미하는 키워드
e.g.,
var someAny: Any = 100 
var someAnyObject: AnyObject = SomeClass()
변수에 nil은 할당할 수 없음. 

5. Array, Dictionary, Set
Array: 순서가 있는 리스트 컬렉션
Dictionary: 키와 값의 쌍의 컬렉션
Set: 순서가 없고, 멤버만 있는 컬렉션
e.g.1,
선언 방법 1. var integers: Array<Int> = Array<Int>()
선언 방법 2. var doubles: Array<Double> = [Double]()
선언 방법 3. var strings: [String] = [String]()
선언 방법 4. var characters: [Character] = []
integers.append(1)
integers.remove(at:0) // 1
integers.contains(1) // false
integers.count // 0
e.g.2,
선언 방법 1. var anyDictionary: Dictionary<String, Any> = [String: Any]()
선언 방법 2. var emptyDictionary: [String: String] = [:]
선언 방법 3. var nonEmptyDictionary: [String: String] = ["name":"jiwan", "gender":"male"]
e.g.3,
var integerSet: Set<Int> = Set<Int>()
let setA: Set<Int> = [1,2,3,4,5]

6. Function
func 함수이름(arg name: arg type, arg2 name: arg2 type ... ) -> return type { fucntion contents )
e.g.1, func printMyName(name: String) -> Void {print(name)}
e.g.2, func sum(a: Int, b: Int) -> Int {return a+b}
e.g.2, func returnOne() -> Int {return 1}
매개변수 기본값
e.g.1, func greeting(friend: String, me: String = "jiwan") {print("Hello \(friend)! I'm \(me)")}
전달인자 레이블 (매개변수의 역할을 좀 더 명확하게 하고자 할 때)
e.g.1, func greeting(to friend: String, from me: String = "jiwan") {print("Hello \(friend)! I'm \(me)")}
greeting(to: "hana", from: "yagom")
가변 매개변수: 매개변수의 개수를 알 기 힘들 때 사용 ...을 붙임 (e.g., friends: String...)
데이터 타입으로써의 함수: 함수 자체가 일급 객체이므로 변수나 상수, 매개변수에도 할당이 가능함.

7. 조건문
조건에는 항상 Bool 타입이 와야함
if, else if, else
switch, case, default

8. 반복문
for item in items
while condition { code }
repeat { code } while condition

9. Optional
Optional: 값이 있을 수도 있고 없을 수도 있음.
왜 필요한가?
1. nil의 가능성을 명시적으로 표현함.
2. 전달받은 값이 옵셔널이 아니라면 nil체크를 하지 않더라도 안심하고 사용 가능 (예외상황 최소화 및 효율적 코딩)
Optional의 정의 (Enum + General)
enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
}
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
Int? = Optional<Int> 의 간략화.
(?: Optional, !: Implicitly Unwrapped Optional)
Int? 에서는 nil값이 있을 수 있기 때문에 연산 불가 e.g. +=1
Int! 에서는 연산은 가능하나 nil이 할당되어있을 경우 런타임 에러가 발생할 수 있음 

10. Optional Unwrapping
Optional Binding: 옵셔널의 값을 꺼내오는 방법 - Nil 체크 + 값 추출
if let 
Force Unwrapping: 강제로 값을 추출
! 사용, Nil을 강제추출 시 런타임 오류 발생 

11. 구조체 Struct
struct Sample {
 var // 가변 프로퍼티
 let // 불변 프로퍼티
 static var // 타입 프로퍼티
 func // 인스턴스 메서드
 static func // 타입 메서드
}
var mutable: Sample = Sample()
mutable.mutableProperty = 100
mutable.instanceMethod()
Sample.typeProperty = 300
Sample.typeMethod() 

12. 클래스 Class
구조체는 값 타입인 반면에 클래스는 참조 타입이다.
타입 메서드의 경우 후에 
static func로 정의하면 재정의가 불가하며,
class func로 정의하면 재정의가 가능하다.

13. 열거형 enum
SWIFT에서의 열거형은 유용한 편. 각 case가 값이다.
enum Weekday {
  case mon
  case tue, wed
}
var day: Weekday = Weekday.mon
day = .tue
enum Fruit: Int {
  case apple = 0
  case grape // 자동으로 1 증가한 1이 할당됨
}
Fruit.apple.rawValue와 같은 형태로 원시값 출력 가능함.
switch day {
  case .mon, .tue:
    print()
  case Weekday.wed:
    print()
}