할당 연산자: =
let color = "blue"
print(color)
저장 프로퍼티
let name = "서온"
name = "민지"
print(name)
// let : 정해진 값(변경 불가)
var name = "Seoon"
name = "Minjee"
print(name)
// var : 변수 선언(저장 X)
연산 프로퍼티
var x = 10
var y = 20
var sum: Int {
get {
return x + y
}
set {
sum = x + y
}
}
print(sum)
출력문
print("잘해보자")
// """ : 멀티라인 텍스트
print("""
오늘은
2주차
문법강의
듣는날
""")
문자 보간법
let name = "서온"
var greeting = "\(name)아 잘해보자"
print(greeting)
주석
// 한 줄 주석
/*
여러줄 주석
*/
// 단축키: cmd + /
메서드
func sayHi(friend: String) {
print("Hi~ \(friend)!")
}
sayHi(friend: "서온")
func sayHi(to friend: String) {
print("Hi~ \(friend)!")
}
sayHi(to: "서온")
func sayHi(_ friend: String) {
print("Hi~ \(friend)!")
}
sayHi("서온")
func sayHi(_ friend: String) -> String {
return("Hi~ \(friend)!")
}
print(sayHi("서온"))
func sayHi(_ friend: String = "서온") -> String {
return("Hi~ \(friend)!")
}
print(sayHi("민지"))
print(sayHi())
배열
// 생성자로 배열 만들기
var ages = Array<Int>()
print(ages)
// 출력값: []
var numbers = [Int]()
print(numbers)
// 출력값: []
var zeroes = [Int](repeating: 0, count: 10)
print(zeroes)
// 출력값: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// 배열의 원소 개수
numbers = [5,6]
print("numbers 배열에 있는 value 개수는 \(numbers.count) 개 입니다")
// 출력값: "numbers 배열에 있는 value 개수는 2 개 입니다
// 배열 마지막에 value 추가하기
numbers.append(3)
print(numbers)
// 현재 numbers = [5,6,3]
numbers[0] = 9
print(numbers)
// 현재 numbers = [9,6,3]
numbers.insert(5, at: 1)
print(numbers)
// 현재 numbers = [9,5,6,3]
let secondValue = numbers.remove(at: 1)
print("secondValue = ",secondValue)
print(numbers)
// 현재 numbers = [9,6,3]
// secondValue = 5
let lastValue = numbers.removeLast()
print("lastValue = ",lastValue)
print(numbers)
// 현재 numbers = [9,6]
// lastValue = 3
let firstValue = numbers.removeFirst()
print("firstValue = ",firstValue)
print(numbers)
// 현재 numbers = [6]
// firstValue = 9
// numbers 배열이 비었는지 확인
let isNoNumber = numbers.isEmpty
print("isNoNumber = ",isNoNumber)
print(numbers)
// isNoNumber = false
numbers.removeAll()
print(numbers)
// 현재 numbers = []
// 배열 초기화
numbers = []
print(numbers)
// 현재 numbers = []
고차함수
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum)
Tuple
let http404Error: (Int, String) = (404, "Not Found")
let (justTheStatusCode, _): (Int, String) = http404Error
print("The status code is \(justTheStatusCode)")
// 출력값: "The status code is 404"
// 튜플 값에 접근하려면 순서를 알고 있어야 함
print("The status code is \(http404Error.0)")
// 출력값: "The status code is 404"
print("The status message is \(http404Error.1)")
// 출력값: "The status message is Not Found"
// 각 엘레먼트에 이름을 붙일 수 있음
let http200Status: (Int, String) = (statusCode: 200, description: "OK")
print(http200Status)
범위 연산자
/*
a...b : a 이상 b 이하
a..<b : a 이상 b 미만
a... ...a : a 이상 , a 이하 (a는 범위에 포함됨)됨
*/
let names = ["안나", "알렉스", "오드리", "잭"]
for name in names[2...] {
print(name)
}
for name in names[...2] {
print(name)
}
for name in names[..<2] {
print(name)
}
삼항 연산자
let height = 150
var nickname = (height > 185) ? "키큰이" : "난장이"
print(nickname)
//? 입력값이 true 이면
//: 입력값이 false 이면
반복문
let sisters = ["A": 38, "B": 31, "C": 29]
for (name, age) in sisters {
print("\(name) 은 \(age) 살이야")
}
for index in 1...5 {
print("\(index) times 5 is \(index * 5)")
}
고차함수, 조건문
// map 함수
let num = ["1", "2", "3", "4", "5"]
var numberArray: [Int] = []
// for 문으로 구현
for index in num {
if let changeToInt = Int(index) {
numberArray.append(changeToInt)
}
}
print(numberArray)
// map으로 구현
let stringArray = ["1", "2", "3", "4", "5"]
numberArray = stringArray.map { Int($0)! }
print(numberArray)
// $0 : 클로저에서 현재 반복 대상을 나타내는 매개변수, 배열의 각 요소를 순회하면서 클로저를 실행
// ! : 옵셔널 값을 강제 언래핑, nil 일경우 런타임 에러 발생
// filter 함수
// numbers에서 짝수만 추출하기
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var evenNumbers: [Int] = []
// for 문으로 구현
for number in numbers {
if number % 2 == 0 {
evenNumbers.append(number)
}
}
print(evenNumbers)
// filter로 구현
// numbers에서 짝수만 추출하기
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)
// 클로저는 {} 중괄호를 사용하여 정의됨. 파라미터/반환타입/실행코드를 포함함, in 키워드를 사용해서 파라미터와 실행코드를 분리함
// reduce 함수
// 각 요소의 합 구하기
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var sum = 0
// for 문으로 구현
for number in numbers {
sum += number
}
print(sum)
// reduce로 구현
// 표현식1
// 각 요소의 합 구하기
let sum1 = numbers.reduce(0, +)
print(sum1)
//표현식2
// 각 요소의 합 구하기
let sum2 = numbers.reduce(0) { $0 + $1 }
// $0와 $1
print(sum2)
/*
{ } 를 익명함수인 클로저라고 함
클로저의 매개변수 이름이 필요하지 않은 경우 단축 인자 이름을 활용할 수 있음($0, $1)
단축 인자이름은 순서대로 $0 , $1 , $2, $3 ...으로 표현
$0 은 첫번째 인자, $1은 두번째 인자
*/
옵셔널(Optional)
// 값이 없을 수 있는 상황에 사용
// ? 물음표로 나타냄(타입 어노테이션)
var serverResponseCode: Int? = 404
print(serverResponseCode)
func pay(with card: String?) {
// 구현 코드
}
nil
// 값이 없는 상태의 옵셔널 프로퍼티를 만들 수 있음
var serverResponseCode: Int? = 404
serverResponseCode = nil
print(serverResponseCode)
var surveyAnswer: String?
// surveyAnswer 는 자동으로 nil 로 설정
print(surveyAnswer)
옵셔널 바인딩
/*
종류 : if let / if var, guard let / guard var
1. if let: if문의 코드 구현부 내에서만 상수 사용 가능(지역 변수)
2. guard let: guard문을 통과한 상수를 guard문 밖에서 사용 가능(전역변수)
*/
let imagePaths = ["star": "/glyphs/star.png",
"portrait": "/images/content/portrait.jpg",
"spacer": "/images/shared/spacer.gif"]
if let starPath = imagePaths["star"] {
print("The star image is at '\(starPath)'")
} else {
print("Couldn't find the star image")
}
let orange: Int? = 1
if orange != nil {
print("오렌지 주문하기")
}
let roommateNumbers: Int? = nil
if let roommates = roommateNumbers {
print (roommates)
}
let ticketCounts: Int? = 3
if let ticket = ticketCounts {
print (ticket)
}
let coin: Int? = nil
print (coin ?? 5)
// ?? : nil 일 경우 대체 값을 넣어라
// 옵셔널 바인딩 할 변수가 여러 개인 경우
let boyName : String?
let girlName : String?
boyName = "하늘"
girlName = "나연"
// , 콤마로 나열합니다
if let boy = boyName,
let girl = girlName {
print(boy, girl)
}
let x : Int? = 10
let y : Int? = nil
func opbinding() {
guard let x = x else {
print("x is Optional")
return
}
print(x)
guard let y = y else {
print("y is Optional")
return
}
print(y)
}
opbinding()
옵셔널 체이닝
struct Person {
var name: String
var address: Address
}
struct Address {
var city: String
var street: String
var detail: String
}
let sam: Person? = Person(
name: "Sam",
address: Address(
city: "서울",
street: "신논현로",
detail: "100"))
print(sam?.address.city)
/*
sam.address.city 는 에러 :
sam은 옵셔널로 선언되었는데 옵셔널 체이닝을 사용하지 않고 접근하려하니 에러남.
접근하려면 ?. 를 붙여야 함
*/
와 실습 많이 해봐야겠다..
문법공부 내일 한번 더 복습해야겠다. 반복 필수.. 화이팅...!