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 |