๐ŸŽ iOS/Swift

    [Swift] self

    self.ํ”„๋กœํผํ‹ฐ๋ช… // ํด๋ž˜์Šค๋‚˜ ๊ตฌ์กฐ์ฒด ์ž์‹ ์˜ ์ธ์Šคํ„ด์Šค์— ์†ํ•œ ํ”„๋กœํผํ‹ฐ self ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ํ”„๋กœํผํ‹ฐ์™€ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ๊ฐ™์„ ๊ฒฝ์šฐ ๊ตฌ๋ถ„์„ ์œ„ํ•ด์„œ self๋ฅผ ๊ผญ ์จ์ฃผ์–ด์•ผํ•œ๋‹ค. class A { var name: String init(name: String) { self.name = name } } ์ด๋‹ˆ์…œ๋ผ์ด์ € ๋‚ด๋ถ€์— ์žˆ๋Š” name ์€ ์ง€์—ญ๋ณ€์ˆ˜ > ๋งค๊ฐœ๋ณ€์ˆ˜ > ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ ์ˆœ์„œ๋กœ ๋ฌด์—‡์„ ์ง€์นญํ•˜๋Š”์ง€ ์ฐพ์Œ. ๊ทธ๋ž˜์„œ name = name ์˜ ๊ฒฝ์šฐ ๋‘๊ฐœ ๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์นญํ•˜๊ฒŒ ๋จ. ์ด๋•Œ, ์ธ์Šคํ„ด์Šค ํ”„๋กœํผํ‹ฐ๋กœ ์ง€์นญํ•˜๊ธฐ ์œ„ํ•ด์„œ self๋ฅผ ์‚ฌ์šฉํ•จ.

    [Swift] Guard๋ฌธ๊ณผ If๋ฌธ

    guard์™€ if์˜ ์ฐจ์ด๋Š” guard๋Š” ํ•ญ์ƒ else๋ฌธ์„ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ⇒ else๋ฌธ์„ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ์ฒ˜๋ฆฌ์— ์šฉ์ดํ•˜๋‹ค! func guardTest(person: [String: String]) { guard let name = person["name"] else { // else ๋ฅผ ์•ˆ์“ฐ๋ฉด compile error print("person is nil") return } print("Name: \\(name)") guard let location = person["location"] else { print("location is nil") return } print("Location: \\(location)") } guardTest(person: ["name": "Jedi"]) print() g..

    [Swift] reduce ์‚ฌ์šฉํ•˜๊ธฐ | sum

    Programmers ํ•˜์ƒค๋“œ ์ˆ˜๋ฅผ ํ’€๊ณ ๋‚˜์„œ, reduce๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋ฅผ ๋งˆ์ฃผ์ณ๋ฒ„๋ ธ๋‹ค. // Programmers ํ•˜์ƒค๋“œ ์ˆ˜ ํ’€์ด func solution(_ x:Int) -> Bool { var sum_x = String(x).map{ Int(String($0))! }.reduce(0, +) return x % sum_x == 0 } ใ…‡ใ…‡.. ๋‚˜๋„ ๊ณต๋ถ€ํ•ด์ค„๊ฒŒ reduce ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๊ฐ’์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ(์—ฐ์‚ฐ)ํ•˜์—ฌ return * Swift์—์„œ๋Š” Python๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ฐฐ์—ด์˜ ์ด ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ sum์ด ์—†๋‹ค. ๋Œ€์‹  reduce๋ฅผ ์‘์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (1) reduce(_: _:) public func reduce(_ initialResult: Result, _ nextPartialResult: (..

    [Swift] map, flatMap, compactMap ?

    Map, flatMap, compactMap map ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ mapping ๊ฐ ์š”์†Œ์— ๋Œ€ํ•œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋“ค์„ ๋ฐฐ์—ด์˜ ์ƒํƒœ๋กœ ๋ฐ˜ํ™˜ func map(_ transform: (String) throws -> T) rethrows -> [T] import Foundation let cast = ["Vivien", "Marlon", "Kim", "Karl"] let lowercaseNames = cast.map { $0.lowercased() } print(lowercaseNames) // ["vivien", "marlon", "kim", "karl"] let letterCounts = cast.map{ $0.count } print(letterCounts) // [6..

    [Swift] inout? | ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ง€์†ํ•˜๊ธฐ

    What is inout? Swift์—์„œ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ƒ์ˆ˜์ด๋ฏ€๋กœ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ ํ•จ์ˆ˜์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธธ ์›ํ•˜๊ณ  + ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์ง€์†๋˜๊ธธ ์›ํ•  ๋•Œ inout ์‚ฌ์šฉ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๋„˜๊ฒจ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ func increment(_ number: Int){ number += 1 print(number) } increment(3) // Error: 'number' is a 'let' constant var number = 3 func increment(_ number: inout Int){ number += 1 print(number) } increment(&number) // 4 How to use inout?..

    [Swift] Protocols | Delegate๋ฅผ ์‚ด์ง ๊ณ๋“ค์ธ

    ํ”„๋กœํ† ์ฝœ์ด๋ž€? ํ”„๋กœํ† ์ฝœ: ์ตœ์†Œํ•œ์œผ๋กœ ๊ฐ€์ ธ์•ผํ•  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น Object๊ฐ€ task๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์„ ์ •์˜ํ•ด์ค€๋‹ค. Java์˜ interface์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. protocol์€ ์„ ์–ธ์ด๊ณ , type์—์„œ ๊ตฌํ˜„ํ•ด์ค˜์•ผํ•œ๋‹ค. ex1) Swift์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜์ธ CustomStringConvertible์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํ‹€๋Œ€๋กœ class๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. var greeting = "Hello, playground" class person: CustomStringConvertible { let name: String let age: Int let isFemale: Bool init(name: String, age: Int..

    [Swift] Guard๋ฌธ | guard let

    Guard๋ฌธ์€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•  ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜์—ฌ ๊ทธ ๋‹ค์Œ์— ์˜ค๋Š” ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. Guard๋ฅผ ์ด์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ์ •๋ฆฌํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 1. control flow์™€ indentation์„ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด → ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ๊ทธ๋กœ ์ธํ•ด ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. 2. ๋ถ€์ ์ ˆํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์—†์• ๋ฒ„๋ฆฌ๊ธฐ ์œ„ํ•ด if๋ฌธ vs guard๋ฌธ if๋ฌธ ์‚ฌ์šฉ ver. func singHappyBirthday(){ if(birthdayIsToday){ if(invitedGuests > 0){ if (cakeCandleLit){ print("Happy Birthday to you!") }else{ print("์ผ€์ต ์ด›๋ถˆ ๋ถˆ ์•ˆ์ผœ์ง") } }else{ print("์ดˆ๋Œ€ ์•„๋ฌด๋„ ์•ˆํ•จ") } }else{ p..

    [Swift] Optionals

    ๋Œ๋‹ค๋ฆฌ๋„ ๋‘๋“ค๊ฒจ๋ณด๊ณ  ๊ฑด๋„ˆ์ž. Optional: ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ Optional์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” 2๊ฐ€์ง€ Case๊ฐ€ ์žˆ๋‹ค. (1) ์–ด๋–ค ๊ฐ’์ด ์žˆ์–ด์„œ ๊ทธ ๊ฐ’์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ (2) ์•„์˜ˆ ๊ฐ’์ด ์—†์–ด์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ - nil: ์•„์ง ๊ฐ’์ด ์—†๋‹ค. โ€ป ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์˜ต์…”๋„๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ต์…”๋„์„ ์ •์˜ํ•˜๋Š” ๋ฒ• Optional์„ ์ •์˜ํ•  ๋•Œ๋Š” ์–ด๋–ค Type ๋’ค์— ?๋ฅผ ๋ถ™์ด๋ฉด ๋œ๋‹ค. ์ด ๋•Œ, Optional์„ ์“ธ ๋•Œ๋Š” ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๊ธฐ์— Type - Inferring์ด ์•ˆ๋˜๋ฏ€๋กœ Type์„ ๋ฐ˜๋“œ์‹œ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค. Optional์—์„œ ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• | Optional Binding let userInputAge..