본문 바로가기
모바일 앱개발/Swift

Day01-10 복습

by GeekCode 2021. 12. 4.
반응형

Day01-10 복습

 

Day01 : Conditional Statements_If

if (조건){ 
	[참인 경우, 실행할 코드] 
} else { 
	[거짓인 경우 실행할 코드] 
}

삼항연산자

[조건에 해당하는 코드] ? [참인 경우, 실행할 코드] : [거짓인 경우 실행할 코드]

Day02 : For-each

Day04 For_Loops

📌 레인지

//0이상 5이하
0...5
//0이상 5미만
0..<5

📌where 이후는 반복을 위한 조건을 사용할 수 있음

짝수일때

//for index in 0..<5 where index % 2 == 0 {

}

📌for loops 안에 다시 for loops 를 넣을 수 있음

for _ in 0..<24 {

    let randomNumber = Int.random(in: 0...100)

    randomInts.append(randomNumber)

}

 

📌index 혹은 iterate

// i-> index 혹은 iterate 때문에 i로 쓰는게 일반적 ->  i를 나중에 다시 쓰지않는다고 알림창이 뜨기때문에 _로 대체사용가능

더보기
더보기
import UIKit


// #1 레인지(범위) 이상 이하
// 0...5
// 0,1,2,3,4,5  총 6자리


// #2 이상 미만
//0..<5
//0,1,2,3,4

// i-> index 혹은 iterate 때문에 i로 쓰는게 일반적
//for index in 0...5 {
// print("index: \(index)")
//}

/*
 index: 0
 index: 1
 index: 2
 index: 3
 index: 4
 index: 5
 */

//for index in 0..<5 {
// print("index: \(index)")
//}
/*
 index: 0
 index: 1
 index: 2
 index: 3
 index: 4
 */

//#4 index에서 짝수만 구하기
//for index in 0..<5 where index % 2 == 0 {
// print("짝수: \(index)")
//}
/*
 짝수: 0
 짝수: 2
 짝수: 4
 */

//#5 빈 배열생성하기
//var randomInts: [Int] = []
var randomInts: [Int] = [Int]()

for _ in 0..<24 {
    let randomNumber = Int.random(in: 0...100)
    randomInts.append(randomNumber)
}

print("randomInt: \(randomInts)")
//-> randomInt: [21, 12, 11, 83, 49, 53, 75, 93, 38, 94, 78, 62, 0, 32, 18, 70, 88, 24, 42, 81, 22, 35, 18, 49]

Day03: enum

1. enum 선언하기

2. 값을 가질 수 있다.

3. 파라미터를 가질 수 있다.

4. enum안에 함수를 만들어 사용할 수 있다.

더보기
더보기
import UIKit
// #1
// 학교 - 초, 중, 고
enum School {
//    case elementary
//    case middle
//    case high
    case elementary, middle, high
}

let yourSchool = School.high
print("yourSchool : \(yourSchool)")
//print("yourSchool:", yourSchool)
//-> yourSchool: high

//#2 enum은 값을 가질 수 있다.
enum Grade: Int {
    case first = 1
    case second = 2
}

//let yourGrade = Grade.second
//print("yourGrade : \(yourGrade)")
// -> yourGrade : second

//let yourGrade = Grade.second
//print("yourGrade : \(yourGrade.rawValue)")
// -> yourGrade : 2

let yourGrade = Grade.second.rawValue
print("yourGrade : \(yourGrade)")
// -> yourGrade : 2


//#3 case에 파라미터를 넣어서 가져올 수 있다.
enum SchoolDetail {
    case elementary(name: String)
    case middle(name: String)
    case high(name: String)
    
    
    //나 자신의 케이스의 값을 가져올 수 있다.
    // 만약에 나 자신이 @@이라면? @@ 하겠다.
    func getName() -> String {
        switch self {
        case.elementary(let name):
            return name
        case let .middle(name):
            return name
        case .high(let name):
            return name
        }
    }
}

let yourMiddleSchoolName = SchoolDetail.middle(name: "기꼬중학교")
print("yourMiddleSchoolName: \(yourMiddleSchoolName)")
//-> yourMiddleSchoolName: middle(name: "기꼬중학교")

// 이름을 그냥 가져올 수 없을까? -> enum 안에 있는 함수를 가져올 수 있다.
let yourHighSchoolName = SchoolDetail.high(name: "기꼬고등학교")
print("yourHighSchoolName: \(yourHighSchoolName.getName())")
// -> yourHighSchoolName: 기꼬고등학교

Day05 Unwrap_Optional

// 옵셔널이란?

옵션이 있을 수도 있고 없을 수도 있다-> 값이 있을 수도 없을 지 모른다.

 

#1 강제 언래핑

#2 if let

//만약 값이 있다면 otherVariable에 넣어 사용하겠습니다.

if let otherVariable = someVariable {

    print("언래핑되었다. 즉 값이 있다. otherVariable: \(otherVariable)")

} else {

    print("값이 없다.")

}

// -> 언래핑되었다. 즉 값이 있다. otherVariable: 90

 

#3 guard let

func unwrap(parameter: Int?){

    print("unwrap() called")

    // 값이 없으면 리턴해버리겠다.

    // 즉 지나간다.

    guard let unWrappedParam = parameter else {

        return

    }

    print("unWrappedParam: \(unWrappedParam)")

}

 

var firstValue : Int? = 30

var secondValue : Int? = 50

print("firstValue: \(firstValue)")

print("secondValue: \(secondValue)")

 

unwrap(parameter: firstValue)

unwrap(parameter: secondValue)


Day06 class_struct

// 변수하나하나를 묶는 방법이 클래스와 스트럭트 두가지가 있다.

 

struct YoutuberStruct {

    var name : String

    var subscribersCount: Int

}

// 메모리에 올리는데 name과 subscribersCount를 쓰라고 정함

var devGikko = YoutuberStruct(name: "기꼬", subscribersCount: 99999)

var devGikkoClone = devGikko

 

devGikkoClone.name = "호롤롤로"

 

 

class YoutuberClass {

    var name : String

    var subscribersCount: Int

// 처음에 메모리에 올리려면 위의 name과 subscribersCount에 대한 값이 없는 상태이기 때문에 외부에서 데이터를 넘겨준다.

// init으로 매개변수를 가진 생성자 메소드를 만들어야 매개변수를 넣어서 그 값을 가진 객체(object)를 만들 수 있다.

    init(name: String, subscribersCount: Int){

// 내가 가지고 있는 이름을 외부에서 들어온 name으로 넣겠다.외부의 subscribersCount를 subscribersCount에 넣겠다.

// 매개변수를 넣을 때 이름을 쓰지 않고 "_"로 사용가능

        self.name = name

        self.subscribersCount = subscribersCount

    }

}

 

var gikko = YoutuberClass(name: "기꼬", subscribersCount: 99999)

var gikkoClone = gikko

gikkoClone.name = "호롤롤롤로"

 

 ====== struct ======

 값 넣기 전 devGikko.name : 기꼬

 값 넣기 전 devGikkoClone.name : 기꼬

 값 넣은 후 devGikkoClone.name : 호롤롤로

 값 넣은 후 devGikko.name : 기꼬

 ====== class ======

 값 넣은 전 gikko.name : 기꼬

 값 넣기 전 gikkoClone.name : 기꼬

 값 넣은 후 gikkoClone.name : 호롤롤롤로

 값 넣은 후 gikko.name : 호롤롤롤로

 

 

스트럭트는 원본과 그에 따른 복사본과 같다.

그래서 복사본의 값이 바뀌어도 원본은 그대로

 

클래스는 원본과 복사본이 연결되어있다.( 같은 곳을 바라보고 있다)

그래서 복사본의 값이 바뀌면 원본도 바뀐다.

 


Day07 property_observer

Property Observers(프로퍼티 옵저버)

 

Apple  :

Property Observers(프로퍼티 옵저버)를 정의해서 프로퍼티 값의 변경을 모니터링 할 수 있습니다. 프로퍼티 옵저버는 자신이 정의한 "저장 프로퍼티"에 추가 할 수 있으며, super class(부모클래스)를 상속한 프로퍼티에도 추가 할 수 있습니다. 

 

프로퍼티 옵저버는 프로퍼티 값의 변화를 관찰하고, 이에 응답합니다.

프로퍼티 옵저버는 새로운 값이 프로퍼티의 현재값과 "동일하더라도" 속성의 값이 설정(set)될 때 마다 호출됩니다.


 willSet - 값이 저장되기 직전에 호출됩니다. 

 didSet - 새로운 값이 저장된 직후에 호출됩니다. 

 

import UIKit

var myAge = 0 {
    willSet{
        print("값이 설정될 예정이다. my Age: \(myAge)")
    }
    didSet{
        print("값이 설정되었다. my Age: \(myAge)")
    }
}

myAge = 10
/*
 값이 설정될 예정이다. my Age: 0
 값이 설정되었다. my Age: 10
 */
myAge = 20
/*
 값이 설정될 예정이다. my Age: 10
 값이 설정되었다. my Age: 20
 */

Day08 function parameter

// #함수 매개변수 이름 function parameter

 

 

함수, 메소드 정의

func myFunction(name: String) -> String {

    return "안녕하세요? \(name)입니다!"

}

// 함수, 메소드를 호출한다. call

myFunction(name: "기꼬")

// -> "안녕하세요? 기꼬입니다!"

 

 

매개변수에  새로운 매개변수(파라미터) 사용

-> 실제 로직처리는 name으로 처리하지만 호출할 때, 다른 이름 사용가능

 

 

// 함수, 메소드 정의

func myFunctionSecond(with name: String) -> String {

    return "안녕하세요? \(name)입니다!"

}

myFunctionSecond(with: "호롤롤로")

// -> "안녕하세요? 호롤롤로입니다!"

 

 

매개변수에 _ 사용

 

// 함수, 메소드 정의

func myFunctionThird(_ name: String) -> String {

    return "안녕하세요? \(name)입니다!"

}

myFunctionThird("하하하하")

// -> "안녕하세요? 하하하하입니다!"




Day09 generic

  • 제네릭을 이용해 코드를 구현하면 어떤 타입에도 유연하게 대응할 수 있다.
  • 제네릭으로 구현한 기능과 타입은 재사용하기도 쉽고, 코드의 중복을 줄일 수 있다.
  • 제네릭을 사용하고자 할 때는 제네릭이 필요한 타입 또는 메서드의 이름 뒤의 홀화살괄호 기호 사이에 제네릭을 위한 타입 매개변수를 써주어 제네릭을 사용할 것임을 표시한다.

제네릭 타입

  • 제네릭 타입을 구현하면 구조체, 클래스, 열거형 등이 어떤 타입과도 연관되어 동작할 수 있다.
  • 제네릭 타입을 정해주면 그 타입에만 동작하도록 제한할 수 있어 안전하고 의도한 대로 기능을 사용하도록 유도할 수 있다.
더보기
더보기
import UIKit

// 제네릭 : 어떤 자료형이라든지 받을 수 있다.
// <> : 제네릭 표기

//보통은 SomeElement가 아닌 "T"로 입력한다.
struct MyArray<SomeElement>{
    // 제네릭을 담은 빈 배열
    var elements : [SomeElement] = [SomeElement]()
    // SomeElement는 형태가 없음
    
    
    // struct는 생성자가 없어도 되는데 편의상 만들었음
    // 생성자
    init(_ elements: [SomeElement]){
    //elements가 들어오게 되면 내가 갖고 있는 elements에 넣어줌
        self.elements = elements
    }
}

struct Friend {
    var name: String
}

struct PpakCoder {
    var name: String
}

// MyArray를 생성할 때 안에 어떤 것이든 넣을 수 있다.
var mySomeArrray = MyArray([1,2,3])
print("mySomeArrray : \(mySomeArrray)")
// -> mySomeArrray : MyArray<Int>(elements: [1, 2, 3])

var myStringArrray = MyArray(["가", "나", "다"])
print("myStringArrray : \(myStringArrray)")
// -> myStringArrray : MyArray<String>(elements: ["가", "나", "다"])

let friend_01 = Friend(name: "철수")
let friend_02 = Friend(name: "영희")
let friend_03 = Friend(name: "수진")

var myFriendsArrray = MyArray([friend_01,friend_02,friend_03])
print("myFriendsArrray : \(myFriendsArrray)")

 


Day10 closure

import UIKit
//클로저
//클로저 자체는 메소드를 실행하게 되는 것


//#1 String을 반환하는 클로저
let myName : String = {
    // myName 으로 들어간다
    return "기꼬"
}()
print(myName)
// -> 기꼬

//#2 매개변수가 있는 클로저만들기
// 클로저 정의
//let myRealName = { (name: String) -> String in
//    return "개발하는 \(name)"
//}

//클로저 정의
//myRealName이라는 클로저를 실행하게 되면, String자료형의 name이라는 매개변수로 받아서 최종적으로 String을 내뱉는 클로저
let myRealName : (String) -> String = { (name: String) -> String in
    return "개발하는 \(name)"
}

myRealName("기꼬")
// -> "개발하는 기꼬"

// #3 반환값이 없는 클로저

// 따로 반환값을 뱉지 않고 매개변수를 가지면서 아래 로직을 담을 수도 있다.
// String을 담아서 내뱉는 것은 없고 실제로 name이라는 String을 받아서 아무런 처리도 하지 않는다.
let myRealNameLogic : (String) -> Void = { (name: String) in
    print("개발하는 \(name)")
}

myRealNameLogic("기꼬 호롤롤로")
// -> 개발하는 기꼬 호롤롤로

반응형

'모바일 앱개발 > Swift' 카테고리의 다른 글

조건문(IF, Switch)  (0) 2021.12.08
Enumeration (열거형)  (0) 2021.12.08
Array  (0) 2021.12.08
Day11_extra_Tuple  (0) 2021.12.07
Day10 closure  (0) 2021.12.03
Day09 generic  (0) 2021.12.03
Day08 function parameter  (0) 2021.12.03
Day07 property_observer  (0) 2021.12.02