728x90
반응형

[강의노트] 왕초보를 위한, 한 번에 끝내는 iOS 앱 개발 바이블

https://opposite-foundation-5b5.notion.site/iOS-4b1c2a2c1baf4ae29971524e9bdfc074

[Github]

https://github.com/cafielo/fc-ios-bible-for-beginner-2022


Create a new Xcode project > File > New > Playground

iOS - Blank > Next > Save As: HelloSwift


01. 변수, 상수

command + /: 주석 변경

변수/상수에 커서 + option (누르면 ? 표시) + 클릭하면 타입 정보 조회 가능

import UIKit

var greeting = "Hello, playground"

// ---------- 01. 변수, 상수 ----------
// var: 변수(variable) 선언
var num = 5
num = 1

// let: 상수(constant) 선언(값 수정 불가)
var name = "Jason"
name = "Jay"

// String
let quote = "I'm mother father genius, Man"

// Integer
let num2 = 5
let otherNum = num2 + 2         // 7
let halfOfNum = otherNum / 2    // 3

// 내장함수
let num3 = 360
// 3의 배수인지 확인하는 코드
print(num3.isMultiple(of: 3))
// 0~300 사이중 랜덤으로 수를 뽑아내는 메소드
let random = Int.random(in: 0...300)

// Double: 소수점을 포함하는 숫자를 표현
let score = 3.6

 

02. bool-array

// ---------- 02. bool-array ----------
// Boolean
let isMan = true
let isHuman = false

var isSingle = true
isSingle.toggle()
isSingle

// String Interpolation
let difficulty = "쉽다"
let maximumAge = 80

let message = "\(maximumAge) 할머니도 배우는 iOS 개발은 \(difficulty)"

// 배열과 딕셔너리
// Array
let ages = [3, 20, 60]
let colors = ["green", "red", "yellow"]
let color = colors[0]

// Dictionary (Key: Value)
let languageCode = [
    "한국" : "ko",
    "미국" : "en",
    "일본" : "ja",
]

// 비어 있는 배열과 딕셔너리 초기화
var emptyArr: [Int] = []
var emptyDic: [String: Any] = [:]

 

03. enum

// ---------- 03. enum ----------
// 서로 관계있는 값들을 모아서 표현한 것
enum WeekDay {
    case mon
    case tue
    case wed
    case thu
    case fri
}
var today: WeekDay = .mon
// var tod: String = "mon"      // error(mom)시 찾기 힘듦

enum MediaType {
    case audio
    case video
}
var mediaType: MediaType = .audio

// 위에서 만들어본 미디어 타입에, 파일 확장자도 문자열로 받을 수 있게 수정
enum MediaType2 {
    case audio(String)
    case video(String)
}
var mp3: MediaType2 = .audio("mp3")
var h264: MediaType2 = .video("h264")

 

04. 조건문, 반복문

// ---------- 04. 조건문, 반복문 ----------
let age = 10
// if문의 조건절에는 boolean 타입을 사용 (e.g. age > 20)
if age > 20 {
    print("성인 입니다")
} else {
    print("미성년 입니다")
}

if age >= 10 && age < 20 {
    print("10대 입니다")
} else if age >= 20 && age < 30 {
    print("20대 입니다")
} else if age >= 30 && age < 40 {
    print("30대 입니다")
} else if age >= 40 && age < 50 {
    print("40대 입니다")
} else {
    print("......")
}

enum Weather {
    case sun
    case cloud
    case rain
}

var weather: Weather = .sun
switch weather {
case .sun:
    print("맑아요")
case .cloud:
    print("흐려요")
case .rain:
    print("비와요")
}

// 배열과 딕셔너리 아이템을 순차적으로 체크할 때 사용
let ages2 = [3, 20, 60]
let languageCode2 = [
    "한국" : "ko",
    "미국" : "en",
    "일본" : "ja",
]
for age in ages2 {
    print("age: \(age)")
}
for (key, value) in languageCode2 {
    print("\(key)의 언어코드는 \(value)")
}

// 일정 횟수를 단순 반복
print("전방에 다짐 10번 발사~~!")
for _ in 0..<10 {
    print("나는 iOS 개발자다!")
}

// while: 특정 조건을 이용해서 반복
var count = 10
print("Ready!")
while count > 0 {
    print("\(count)...")
    count -= 1
}
print("START!")

 

05. 옵셔널

// ---------- 05. 옵셔널 ----------
// 값이 있을수도 있고 없을수도 있음을 표현
// Dictionary (Key: Value)
let languageCode3 = [
    "한국" : "ko",
    "미국" : "en",
    "일본" : "ja",
]
// let 상수 타입은 String? (타입 + ?)
let krCode = languageCode3["한국"]    // "ko"
let jpCode = languageCode3["일본"]    // "ja"
let deCode = languageCode3["독일"]    // nil

// 이름이 있을 수도 있고 없을 수도 있는 타입 선언 - String?
var name2: String? = nil
name2 = "Jason"
name2 = nil

 

06. 함수, 클로저

// ---------- 06. 함수, 클로저 ----------
// 함수는 func 키워드를 사용해서 선언
func printGugu(dan: Int) {
    for i in 1...9 {
        print("\(dan) * \(i) = \(dan * i)")
    }
}
printGugu(dan: 5)

func rollDice() -> Int {
    return Int.random(in: 1...6)
}
let random2 = rollDice()

// 클로저: 이름이 존재하지 않는 함수
// 함수
func call(name: String) {
    print("hello, \(name)")
}
call(name: "Jason")
// 상수에 함수를 할당하고, 해당 상수를 호출
let callName = call
callName("Aha")
// 상수에 클로저 할당하고, 해당 상수 호출
let helloName = { (name: String) in
    print("hello, \(name)")
}
helloName("Oho")
// 클로저 형태: 함수와 거의 동일, in을 통해 파라미터 및 반환 타입과 실제 클로저 코드 분리
// { (name: String) -> Bool in ~ some code ~ }
// filter
let members = ["Jason", "Greg", "Tiffany"]
let nameHasT = members.filter { name in
    return name.hasPrefix("T")
}
// map
let prices = [1000, 2000, 3000]
let doubledPrices = prices.map { price in
    return price * 2
}
// reduce
let revenues = [100, 200, 300]
let totalRevenue = revenues.reduce(0) { partialResult, next in
    return partialResult + next
}

 

07. 클래스 구조체1

// ---------- 07. 클래스 구조체1 ----------
struct Album {
    // 멤버 변수들 - stored property
    let title: String
    let artist: String
    var isReleased = false
    
    // 생성자: 클래스 또는 구조체를 생성할 때 사용하는 특별한 함수(init 키워드로 선언)
//    init(title: String, artist: String) {
//        self.title = title
//        self.artist = artist
//    }
    func description() -> String {
        return "\(title) by \(artist)"
    }
    // 구조체 내부 멤버 변수의 값을 변경하는 경우, mutating 키워드 이용
    mutating func release() {
        self.isReleased = true
    }
}
var easyOnMe = Album(title: "Easy On Me", artist: "Adele")
print(easyOnMe.description())
print(easyOnMe.isReleased)
easyOnMe.release()
print(easyOnMe.isReleased)

// 클래스: 상속 가능   참조(reference)   생성자를 기본으로 만들어주지 않음
// 구조체: 상속 불가능  복사(copy)
class Employee {
    var name: String
    var hours: Int
    
    init(name: String, hours: Int) {
        self.name = name
        self.hours = hours
    }
    func work() {
        print("I'm working now...")
    }
    func summary() {
        print("I work \(self.hours) hours a day. ")
    }
}
class iOSDeveloper: Employee {
    override func work() {
        print("I'm developing iOS app now.")
    }
    override func summary() {
        print("I work \(self.hours/2) hours a day.")
    }
}
struct Phone {
    var modelName: String
    var manufacturer: String
    var version: Double = 1.0
}

let normalWorker = Employee(name: "Kim", hours: 8)
normalWorker.work()
normalWorker.summary()
//    I'm working now...
//    I work 8 hours a day.
let developer = iOSDeveloper(name: "Jason", hours: 8)
developer.work()
developer.summary()
//    I'm developing iOS app now.
//    I work 4 hours a day.

// Reference vs. Copy
var iPhone1 = Phone(modelName: "iPhone 13", manufacturer: "Apple")
var iPhone2 = iPhone1
iPhone2.modelName = "iPhone 14"
print(iPhone2.modelName)
print(iPhone1.modelName)
//    iPhone 14
//    iPhone 13
var jrDeveloper1 = iOSDeveloper(name: "John", hours: 8)
var jrDeveloper2 = jrDeveloper1
jrDeveloper1.name = "Billy"
print(jrDeveloper1.name)
print(jrDeveloper2.name)
//    Billy
//    Billy

 

08. 클래스 구조체2

// ---------- 08. 클래스 구조체2 ----------
// stored property: 클래스, 구조체가 값을 저장하고 있는 프로퍼티
// computed property: 따로 값 저장하지 않음, stored property를 활용학거나 특정값을 전달할 때 사용하는 프로퍼티
struct Watch {
    let model: String
    let manufacturer: String
    
    var description: String {
        return "\(model) by \(manufacturer)"
    }
}
struct Person {
    let firstName: String
    let lastName: String
    
    var fullName: String {
        return "\(firstName) \(lastName)"
    }
}
let appleWatch = Watch(model: "Watch 7", manufacturer:  "Apple")
print(appleWatch.description)
// Watch 7 by Apple
let jason = Person(firstName: "Jason", lastName: "Lee")
print(jason.fullName)
// Jason Lee

 

09. 프로토콜

// ---------- 09. 프로토콜 ----------
// 제공하고 싶은 역할(기능, 속성)을 미리 정의해 놓은 것
// 이후에 다른 타입이 해당 프로토콜의 역할을 제공하고 싶으면, conform해서 제공함
protocol Coach {
    var name: String { get set }
    var currentTeam: String { get }
    func training()
    func direct()
}
struct Mourinho: Coach {
    var name: String = "Jose Mourinho"
    var currentTeam: String = "AS Roma"
    
    func training() {
        print("Traing Player")
    }
    
    func direct() {
        print("Direct Game")
    }
}
let mourinho = Mourinho()
print("\(mourinho.name), \( mourinho.currentTeam)")
mourinho.training()
mourinho.direct()
//    Jose Mourinho, AS Roma
//    Traing Player
//    Direct Game

 

10. 익스텐션

// ---------- 10. 익스텐션 ----------
// 기존 타입에 새로운 역할(기능 및 속성)을 추가하고 싶을 때 사용
extension String {
    func contains(s: String) -> Bool {
        return self.range(of: s) != nil
    }
    func replace(target: String, with: String) -> String {
        return self.replacingOccurrences(of: target, with: with)
    }
}
let testString = "Hello iOS Developer!!"
let replaced = testString.replace(target: "Hello", with: "안녕하세요")
print(replaced)
//    안녕하세요 iOS Developer!!
print(testString.contains(s: "iOS"))
// true

 

11. 앞으로 스위프트 공부방향

swift language apple

https://developer.apple.com/kr/swift/

swift language guide

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 


[Next] (2주차) 실습

2022.06.26 - [Swift] - [Xcode] iOS Swift 앱 개발 Byte Degree - week.02

 

[Xcode] iOS Swift 앱 개발 Byte Degree - week.02

iOS 아키텍처 패턴 중 애플에서는 기본적으로 MVC 패턴을 가이드함 Product Name: HelloiOS Organization Identifier: com.sehee Interface: Storyboard (other options: SwiftUI) Language: Swift (other option..

sarahee.tistory.com

 

 

728x90
728x90

+ Recent posts