조건문
Ex. 20 보다 작으면 청소년, 20 보다 크면 성인
var age = 30
if age > 20 {
print("성인")
} else {
print("청소년")
}
var fruit = "apple"
if fruit == "apple" {
print("apple JMT")
} else if fruit == "grape" {
print("grape JMT")
} else if fruit == "pear" {
print("pear JMT")
} else {
print("fruit JMT")
}
var fruit = "apple"
switch fruit {
case "apple" :
print("apple JMT")
case "grape" :
print("grape JMT")
case "pear" :
print("pear JMT")
default :
print("fruit JMT")
}
반복문
Ex. 0부터 99까지 출력
for i in 0..<100 {
print(i)
}
Ex. 0부터 100까지 출력
for i in 0...100 {
print(i)
}
var people = ["a", "b", "c", "d", "e"]
for person in people {
print(person)
}
var people = ["a", "b", "c", "d", "e"]
for i in 0..<people.count {
var person = people[i]
print(person)
}
옵셔널
var someValue: String? = "어떤 값"
someValue = nil
var anotherValue: String = "다른 값"
anotherValue = nil // error
옵셔널을 쓰는 이유
태초에 비어 있는 값이 없어 0 과 같은 값을 비어 있는 값이라 약속
후에 자바에서 null이 도입되었지만, 해당 변수가 비어 있는지 확인하는 코드 작성 필요
Swift에서는 Optional이라는 개념을 도입해 값이 비어 있는지 확인할 필요가 없어짐
// 옵셔널 체인 (Optional Chaining) : 한번 nil이면 그 뒤로 계속 nil
var someFruits = ["A", "B", "C", "D", "E"]
print(someFruits.first?.count)
someFruits = []
print(someFruits.first?.count) // nil
// 옵셔널 강제 해제 : 옵셔널인 변수를 nil이 아니라 확신시켜주는 !
var anotherFruits: String = someFruits.first!
print(anotherFruits) // A
var value: Int = 3
var valueToBeSet: Int! = 4
var valueCanBeNil: Int? = 5
value = valueToBeSet // 가능 - ! (? 없는 변수와 ? 사이 ...)
value = valueCanBeNil // 불가능 - ? 이기 때문에
value = valueCanBeNil! // 가능 - ! 로 변경하였기 때문
swift - 객체지향 프로그래밍 (OOP; Object-Oriented Programming) 언어
. 연산자
- a.b는 a의 하위 속성 b 언급
- a.c()는 a에게 c라는 함수 실행
// 타입 정의
struct Work {
var task: String
var hoursToDo: Int
}
var firstWork = Work(task: "study", hoursToDo: 3)
var secondWork = Work(task: "laundry", hoursToDo: 1)
class Student {
var name: String
var house: String
init(name: String, house: String) {
self.name = name
self.house = house
}
}
var lee = Student(name: "leedayeong", house: "Seoul")
구조체와 클래스 모두 내부에 변수(프로퍼티)를 가질 수 있고 . 연산자를 통해 접근
구조체와 클래스 모두 내부에 함수(메소드)를 가질 수 있고 . 연산자를 통해 접근
구조체
struct Work {
var task: String
var hoursToDo: Int
}
//1. 구조체는 init 함수를 만들지 않아도 자동으로 만들어줍니다.
var firstWork = Work(task: "강의자료 작성하기", hoursToDo: 3)
var secondWork = Work(task: "분리수거 하기", hoursToDo: 1)
//2. 구조체를 대입하면 그 '값'을 복제합니다.
var firstWorkCopy = firstWork
//3. 원본 구조체 변수에 접근해서 값을 변경해볼까요?
firstWork.hoursToDo -= 1
//원본과 복사본 둘이 서로 다른 값을 가지는군요?
print(firstWork) // Work(task: "강의자료 작성하기", hoursToDo: 2)
print(firstWorkCopy) // Work(task: "강의자료 작성하기", hoursToDo: 3)
클래스
class Student {
var name: String
var house: String
init(name: String, house: String) {
self.name = name
self.house = house
}
func introduce() {
print("\(house) 기숙사에 사는 \(name) 입니다")
}
}
// 1. 클래스는 init 함수를 꼭 만들어 주어야 합니다.
var joo = Student(name: "주정한", house: "슬리데린")
// 2. 클래스를 대입하면 복제인간을 만드는 게 아니라 그냥 별명을 하나 새로 붙인다 정도
var anotherJoo = joo
joo.introduce() // 슬리데린 기숙사에 사는 주정한 입니다
anotherJoo.introduce() // 슬리데린 기숙사에 사는 주정한 입니다
joo.house = "레번클로" // 전학(?)
joo.introduce() // 레번클로 기숙사에 사는 주정한 입니다
anotherJoo.introduce() // 레번클로 기숙사에 사는 주정한 입니다