728x90
이름짓기 규칙
- 기본적으로 카멜 케이스 사용
- Lower Camel Case: fuction,method,variable.constant
- Upper Camel Case: type(class,struct,enum,extension)
콘솔 출력
- print
- 단순히 문자열 출력
- dump
- 인스턴스의 자세한 설명(description property)까지 출력
문자열 보간법
- String Interpolation
- 프로그램 실행 중 문자열 내에 변수 또는 상수의 실질적인 값을 표현하기 위해 사용한다.
- \( )
import Swift let age: Int = 10 "안녕하세요 저는\\(age + 5)살입니다!"
Any, AnyObject, nil
- Any
- Swift의 모든 타입을 지칭하는 키워드
- 어떤 타입도 수용 가능합니다.
컬렉션 타입
- Array
- 순서가 있는 리스트 컬렉션
var integers: Array<Int> = Array<Int>() var doubles: [Double]() var strings: [strings] = [] let을 사용하여 Array를 선언하면 변경 불가 intergers.remove(at:0)
- Dictionary
- 키와 값의 쌍으로 이루어진 컬렉션
var anyDcitionary: Dictionary<String,Any> = [String: Any]() anyDictionary["someKey"] = "value" anyDictionary["anotherKey"] = "100" anyDictionary.removeValue(forKey: "anotherKey") anyDictionary["someKey"] = nil
- Set
- 순서가 없고, 멤버가 유일한 컬렉션
- 집합연산할때 매우 유용하다
var integerSet: Set<Int> = Set<Int>() //집합연산할때 매우 유용하다 let setA: Set<Int> = [1,2,3,4] let setB: Set<Int> = [5,6,7,8] //합집합 let union: Set<Int> = setA.union(setB) let sortedUnion: [Int] = union.sorted() // 배열 표현
함수
func 함수이름(매개변수이름: 매개변수 타입) → 반환타입(반환이없다면 Void) {
함수 구현
return 반환
}
함수 고급
- 전달인자 레이블
- 전달인자 레이블은 함수를 호출할 때
- 매개변수의 역할을 좀더 명확하게 하거나 함수 사용자의 입장에서 표현하고자 할 때 사용한다.
func gretting(to friend: String, from me: String) { print("Hello \\(friend)! I'm \\(me)") } gretting(to: "MK" , from: "bulmang")
- 가변매개변수
- 가변 매개변수는 전달 받을 값의 개수를 알기 어려울 때 사용할 수 있다.
- 함수당 하나 가질 수 있다.
- func sayHelloToFriends(me: String, friends: String...) -> String { return "Hello \\\\(friends)! I'm \\\\(me)" } print(sayHelloToFriends(me: "bulmang", friends: "MK","PJ","HA"))
- 스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어
- 스위프트의 함구는 일급객체이므로 변수, 상수등에 저장이 가능하고 매개변수를 통해 전달 할 수 있다.
var someFunction: (Stirng, String) → Void = greeting(to: from:)
조건문
switch
- 정수 외의 대부분의 기본 타입을 사용할 수 있다.
switch "yagom" {
case "jake":
print("jake")
case "mina", "bulmang":
print("mina")
case "yagom":
print("yagom!!")
default:
print("unknown")
반복문
var integers = [1,2,3]
while intergers.count > 1 {
intergers.removeLast()
}
repeat {
integers.removeLast(
} while ingegers.count > 0
옵셔널(Optional)
- 값이 있을수도, 없을 수 도 있음
- 이유
- nil 가능성을 문서화 하지 않아도 코드만으로 충분히 표현 가능
- 문서/주석 작성 시간을 절약
- 전달받은 값이 옵셔널이 아니라면 nil체크를 하지 않더라도 안심하고 사용
- 효율적인 코딩
- 예외 상황을 최소화하는 안전한 코딩
func someFunction(someOptionalParam: Int?) {
}
someFunction(someOptionalParam: nil)
enum Optional<Wrapped> : ExpressilbeByNilLiteral {
case none
case some(Wrapped)
}
let optionalValue: Int? = nil
- Implicitly Unwrapped Optional(암시적 추출 옵셔널)
- 열거형
var optionalValue: Int! = 100 switch optionalValue { case .none: print("nil") case .some(let value): print("value = \\(value)") } //기존변수처럼 사용가능 optionalValue = optionalValue + 1 // nil 할당 가능 optionalValue = nil // 잘못된 접근으로 인한 런타임 오류 발생 optionalValu= optionalValue + 1
- Optional
- var optionalValue: Int? = 100 switch optionalValue { case .none: print("This Optional variable is nil") case .some(let value): print("Value is \\(value)") // nil 할당 가능 optionalValue = nil // 기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른 타입이므로 연산불가 optionalValue = optionalValue + 1
- Optional Unwrapping
- Optional Binding 옵셔널을 바인딩 방법
- nil 체크 + 안전한 값 추출
func printName(_ name: String) { print(name) } var myName: String! = nil if let name: String = myName { printName(name) } else { print("myName == nil") }
- 강제추출 Force Unwrapping
- 뒤에 느낌표를 붙이면 강제로 추출 (nil값이면 오류)
- Optional Binding 옵셔널을 바인딩 방법
구조체
- 타입을 정하는 거 때문에 대문자 카멜케이스를 사용한다.
- 프로퍼티 는 인스턴스 변수
- 메소드는 구조체 안에 들어 있는 함수
클래스
- 참조타입
- 다중상속이 되지 않음.
- 구조체와 유사하고 프로퍼티와 메소드를 가질 수 있다.
- 타입 메소드에 두가지 타입 메소드가 있다
- 재정의 불가 static
- 재정의 가능 class
열거형
- 각각의 케이스가 고유의 값
enum 이름 {
case name1
case name4
case name2
}
enum Weekday {
case mon
case tue
case wed
}
var day: Weekday = Weekday.mon
day = .tue
switch day {
case .mon, .tue, .wed, .thu:
print("평일입니다")
case Weekday.fri:
print("불금 파티!!")
case .sat, .sun:
print("신나는 주말!")
}
enum Fruit: Int {
case apple = 0
case grape = 1
case peach
}
enum School: String {
case elementary = "초등"
case middle = "중등"
case high = "고등"
case university
}
Class
- 단일 상속
- (인스턴스/타입) 메소드
- (인스턴스/타입) 프로퍼티
- 참조타입
- Apple 프레임워크의 대부분의 큰 뼈대는 모두 클래스로 구성
Struct
- C언어 등의 구조체보다 다양한 기능
- 상속 불가
- (인스턴스/타입) 메소드
- (인스턴스/타입) 프로퍼티
- 값 타입
- Swift의 대부분의 큰 뼈대는 모두 구조체로 구성
Enum
- 다른 언어의 열거형과는 많이 다른 존재
- 상속 불가
- (인스턴스/타입) 메소드
- (인스턴스/타입) 연산 프로퍼티
- 값 타입
- 열거형 자체가 하나의 데이터 타입 열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급
- 선언 키워드 - enum
구조체는 언제 사용하나?
- 연관된 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을 때
- 다른 객체 또는 함수등으로 전달될 때 참조가 아닌 복사를 원할 때
- 자신을 상속할 필요가 없거나 자신이 다른 타입을 상속 받을 필요가 없을 때
- Apple 프레임워크에서 프로그래밍 할 때에는 주로 클래스를 많이 사용
Value vs Reference
- Value
- 데이터를 전달할 때 값을 복사하여 전달
- Reference
- 데이터를 전달할 때 값의 메모리 위치를 전달
스위프트는 구조체,열거형 사용을 선호
Closure 클로저
- 코드의 블럭
- 변수 , 상수등으로 저장, 전달인자로 전달이 가능
- 함수 : 이름이 있는 클로저
// 함수 사용
func sumFunction(a: Int, b: Int) -> Int {
return a + b
}
// 클로저 사용
var sum: (Int,Int) -> Int = { (a: Int, b: Int) -> Int in
return a + b
}
- 함수는 클로저의 일종
- 함수의 전달인자로서의 클로저
728x90
'SwiftUI > 정리' 카테고리의 다른 글
[Swift] SwiftLint (0) | 2023.09.04 |
---|---|
[SwiftUI] NavigationStack (0) | 2023.09.02 |
[Swift] 첫 iOS 앱 개발자를 위한 가이드 from Lingo (0) | 2023.03.13 |
[Swift] Swift에서 사용되는 디자인 패턴(pattern)과 예제 코드 (0) | 2023.03.04 |
[SwiftUI] Geometry (0) | 2023.02.23 |