[Swift] 기초문법 강의 복습

Oni·2023년 9월 1일
0

TIL

목록 보기
7/47
post-thumbnail

원문 포스팅 🔗

Swift 첫 시작


할당 연산자: =

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은 옵셔널로 선언되었는데 옵셔널 체이닝을 사용하지 않고 접근하려하니 에러남. 
접근하려면 ?. 를 붙여야 함
*/

와 실습 많이 해봐야겠다..
문법공부 내일 한번 더 복습해야겠다. 반복 필수.. 화이팅...!

profile
하지만 나는 끝까지 살아남을 거야!

0개의 댓글