/date 24.10.15.
스위프트 공식 문서와 비공식 한글 번역 문서를 참고했습니다.
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/guidedtour/
https://bbiguduk.gitbook.io/swift/welcome-to-swift/swift-a-swift-tour
오늘의 목표: Simple Values부터 Object and Class까지
📌 Simple Values
- Hello World!
print("Hello World!")
main()도, 세미콜론도 필요하지 않음
- var 변수, let 상수
let explicitDouble: Double = 70
let theNumber: Float = 4
colon 뒤에 type을 specify 해서 설정해 줄 수 있음
- \ ( ) : values를 strings에 포함 가능하게 함. 별도의 변환이 필요하지 않음!
- """ : string을 여러 줄 작성 가능하게 함
let apples = 3
let oranges = 5
let quotation = """
Renee has five grapefruits.
Sabrina has 7 bananas.
And I have \(apples) apples and \(oranges) oranges.
"""
- new variable에 배열 혹은 딕셔너리를 배정할 경우, type 설정이 필수적
let emptyArray: [String] = []
let emptyDictionary: [String : Float] = [ : ]
📌 Control Flow
- optional value를 if문에서 활용할 수 있다: ?(물음표)를 type뒤에 작성
var optionalName: String? = "Gabi"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
else {
greeting = "Hi there!"
}
name = optionalName이 Nil이 아닌 경우(=존재할 경우), greeting이 "Hello, Gabi"로 출력. Nil이면 skip
- ??: default value
let informalGreeting = "Hi \(nickname ?? fullName)"
optional value인 nickname이 없다면 default value인 fullname이 출력됨
- Switches support any kind of data and a wide variety of comparison operations
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?") //"Is it a spicy red pepper?"
default:
print("Everything tastes good in soup.")
}
조건에 맞으면 바로 빠져나오기 때문에 따로 break를 걸 필요는 없다.
- 반복문: while, for
var m = 2
repeat { m*=2 } while m < 100 //m=128
m < 0인 경우처럼 loop condition이 애당초 false일 경우는 오류를 발생시키는 것이 아니라 그저 반복문이 실행되지 않는 결과를 낳는다.
📌 Functions and Closures
- Parameter와 Return type은 ->로 구분
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
person, day parameter를 string으로 받고 그 결괏값을 string으로 돌려줌
- tuple의 사용
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
//생략...min, max, sum 구하는 for문
return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2) //두 print의 결과는 동일 (120)
- 함수는 중첩 가능하다(can be nested)
중첩된 함수(안쪽 함수)가 본인 밖에서 선언된 변수에 접근 가능
- 함수는 1급 객체다(first-class type)
1급 객체: 변수를 통해 참조 가능 / 함수의 매개변수로 전달 가능 / 함수의 반환값으로 사용 가능
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne //makeIncrementer()의 반환값이 addOne이라는 함수
}
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for items in list {
if condition(item) {
return true
}
}
return false
func lessThanTen(number: Int) -> Bool {
return number < 10
}
}
함수는 본질적으로 closure클로저와 같다
📌 Objects and Classes
- 클래스 생성과 점 구문
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
<class 클래스 이름>의 형태로 클래스 생성
클래스는 설계도 내지는 템플릿. 어떤 객체가 가져야 할 속성과 메서드를 정의한다.
var shape = Shape()
클래스 이름 뒤 소괄호를 붙여서 클래스의 인스턴스* 생성
인스턴스는 클래스를 기반으로 실제 데이터를 가진 객체를 의미한다.
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
}
* init(생성자) : 인스턴스의 초기 상태 설정. NamedShape 클래스에서 이름(name)을 문자열로 받을 수 있도록 초기값 설정
* self: 현재 인스턴스 자신을 가리킴
* self.name은 인스턴스 속성, 등호 뒤 name은 init의 매개변수. 클래스의 속성인 name에 함수로 전달받은 name을 전달하는 것. self를 사용하지 않으면 둘 다 함수의 매개변수로 인식될 수 있다.
- 하위 클래스(subclass): 클래스 이름 뒤 콜론으로 구분
* 상위 클래스(superclass): 다른 클래스에 물려줄 기본적인 속성과 메서드를 정의. 보통 더 일반적인 개념이라고 할 수 있다
class Animal {
//상위 클래스로 animal 생성
var name: String //이름을 저장하는 속성
init(name: String) {
self.name = name
}
func sound() {
print("Animal is running.")
} //method
}
class Dog: Animal {
//Animal의 속성과 method를 그대로 사용 가능 + override로 재정의 가능
override func sound() {
print("the dog barks.")
}
func run() {
print("\(name) is running!")
} //추가적으로 run()을 정의
}
만약 override 없이 method를 재정의한다면 컴파일러가 에러로 이를 감지하게 된다.
- getter / setter
* getter : 프로퍼티의 값을 읽을 때 호출되는 함수
* 프로퍼티에 값을 설정할 때 호출되는 함수
** 프로퍼티? 클래스 안에서 정의된 변수로 클래스의 인스턴스가 갖는 데이터
class car {
//중략
var carDescription: String {
get {
return "the car is \(color)"
}
set(newDescription) {
let details = newDescription.split(separator: "")
//중략
}
}
setter에서 괄호 안에 새로운 값의 이름을 지정해줄 수 있다. 지정하지 않을 시 newValue로 자동으로 지정됨
'학습 기록 > swift' 카테고리의 다른 글
날짜 플래너: 앱 데이터 지속화하기 (0) | 2024.10.27 |
---|---|
날짜 플래너: 데이터 모델 이해하기 및 동적 목록 생성하기 (0) | 2024.10.26 |
The Basics #1 (0) | 2024.10.22 |