곡뢀 μ—°μŠ΅μž₯ :-)

쑰건문 switch-case, fallthrough

|

switch-case

switch <λΉ„κ΅λŒ€μƒ> {
    case <λΉ„κ΅νŒ¨ν„΄1> :
  	<비ꡐ νŒ¨ν„΄1이 μΌμΉ˜ν–ˆμ„λ•Œ μ‹€ν–‰ν•  ꡬ문>
  	case <λΉ„κ΅νŒ¨ν„΄2>, <λΉ„κ΅νŒ¨ν„΄3> : //(ex. case 2, 3: )
  	<비ꡐ νŒ¨ν„΄ 2κ°€ μΌμΉ˜ν–ˆμ„λ•Œ μ‹€ν–‰ν•  ꡬ문>
  	default :
  	<μ–΄λŠ λΉ„κ΅νŒ¨ν„΄κ³Όλ„ μΌμΉ˜ν•˜μ§€ μ•Šμ•˜μ„λ•Œ μ‹€ν–‰ν•  ꡬ문>
}
  • μΌμΉ˜ν•˜λŠ” λΉ„κ΅νŒ¨ν„΄μ΄ μžˆμ„κ²½μš° ν•΄λ‹Ή 블둝을 μ‹€ν–‰ν•˜κ³  전체 λΆ„κΈ°λ¬Έ μ’…λ£Œ
  • μΌμΉ˜ν•˜λŠ” λΉ„κ΅νŒ¨ν„΄μ΄ 또 μžˆλ”λΌλ„ μΌμΉ˜ν•˜λŠ” 것 ν•˜λ‚˜λ§Œ μ‹€ν–‰ν•˜κ³  μ’…λ£Œν•¨

fallthrough

let sampleChar: Character = "a"

switch sampleChar {
    case "a" :
  		fallthrough
  	case "A" :
  		print("κΈ€μžλŠ” Aμž…λ‹ˆλ‹€.")
  	default : 
  		print("μΌμΉ˜ν•˜λŠ” κΈ€μžκ°€ μ—†μŠ΅λ‹ˆλ‹€.")
}
  • case문이 λΉ„μ–΄μžˆμœΌλ©΄ μ•ˆλ¨
  • λͺ…μ‹œμ μœΌλ‘œ fallthroughꡬ문을 μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή caseλ¬Έ(case1)은 λΉ„κ΅νŒ¨ν„΄μ΄ μΌμΉ˜ν•œ 경우 κ·Έ λ‹€μŒ case(case2)문으둜 흐름을 전달
  • 싀행흐름을 전달받은 case2ꡬ문은 λΉ„κ΅νŒ¨ν„΄μ˜ μΌμΉ˜μ—¬λΆ€μ™€ 상관없이 μž‘μ„±λœ ꡬ문을 μ‹€ν–‰ν•œν›„ switch문을 μ’…λ£Œ
  • default : caseλ¬Έμ—μ„œ μΌμΉ˜ν•˜λŠ” μΌ€μ΄μŠ€λ₯Ό 찾지 λͺ»ν–ˆμ„ 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ defaultκ°€ λ°˜λ“œμ‹œ ν•„μš”ν•˜κ³ , λͺ¨λ“  case문에 λͺ¨λ“  νŒ¨ν„΄μ„ λ§€μΉ­μ‹œν‚¬ 수 μžˆλŠ” κ²½μš°μ— ν•œν•΄ default문을 μƒλž΅ν•  수 μžˆλ‹€.
var value = (2,3)

switch value {
    case let (x,3) :
  		print("νŠœν”Œμ˜ 두 번째 값이 3μΌλ•Œ 첫번째 값은 \(x)μž…λ‹ˆλ‹€")
    case let (x,3) :
  		print(abc)
    case let (x,3) :
  		print(abc)
}
  • 좜λ ₯ν•¨μˆ˜ λ‚΄μ—μ„œ λ³€μˆ˜λ₯Ό λ°›μ•„μ„œ 좜λ ₯ν• λ•Œ \ (λ³€μˆ˜μ΄λ¦„)

###

TIL_20171020

|

였늘 배운 / λŠλ‚€ 것

  • νŠœν”Œ - μŠ€μœ„ν”„νŠΈμ˜ 집단 μžλ£Œν˜• 쀑 ν•˜λ‚˜
  • νŠœν”Œκ³Ό νƒ€μž…μ•Œλ¦¬μ–΄μŠ€ ν¬μŠ€νŒ…
  • νƒ€μž… μ•Œλ¦¬μ–΄μŠ€

    νƒ€μž…ν‘œν˜„μ„ μƒˆλ‘œμš΄ νƒ€μž…λͺ…μœΌλ‘œ μ •μ˜ν•΄μ£ΌλŠ” 문법. 주둜 μ€‘λ³΅λ˜κ±°λ‚˜ μ‚¬μš©ν•˜κΈ° λ³΅μž‘ν•œ νƒ€μž… ν‘œν˜„μ„ μž¬μ •λ¦½ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λœλ‹€.

    보톡 내뢀에 μ„ μ–Έν•˜λŠ” Nested νƒ€μž…μ„ μ€„μ—¬μ„œ μƒˆλ‘œμš΄ νƒ€μž…μ΄λ¦„μœΌλ‘œ μ€„μ—¬μ„œ ν‘œν˜„ν•˜λŠ” 정도. νŠœν”Œ 같은 ν˜•νƒœμ— 이름을 λΆ™μ—¬μ£ΌλŠ” μš©λ„.

  • μŠ€μœ„ν”„νŠΈμ˜ 좔상화

  • var와 let - β€œMutable와 Immutable”
  • Git의 컀밋과 λΈŒλžœμΉ˜μ— λŒ€ν•΄ κ°•μ˜λ“€μŒ : 컀밋은 μ»΄ν“¨ν„°μ˜ μ„Έμ΄λΈŒν¬μΈνŠΈ, 객체 / λΈŒλžœμΉ˜λŠ” κ·Έ 객체의 μ°Έμ‘°

μ•žμœΌλ‘œ ν•  것

  • 집단 μžλ£Œν˜• 더 읡히기
  • Git 의 λΈŒλžœμΉ˜μ— λŒ€ν•΄ 곡뢀λ₯Ό μ’€ ν•΄μ•Όκ² λ‹€

νŠœν”Œκ³Ό νƒ€μž…μ•Œλ¦¬μ–΄μŠ€(Tuple,Typealias)

|

νŠœν”Œ

ν•œ ν•¨μˆ˜μ—μ„œ μ—¬λŸ¬ 개의 값을 λ¦¬ν„΄ν•΄μ•Όν•œλ‹€λ©΄, 이 값을 담을 수 μžˆλŠ” 집단 μžλ£Œν˜•μ΄ ν•„μš”ν•˜λ‹€. μ΄λŸ¬ν•œ 집단 μžλ£Œν˜•μ€ λŒ€ν‘œμ μœΌλ‘œ λ”•μ…”λ„ˆλ¦¬, λ°°μ—΄, νŠœν”Œ, ꡬ쑰체, ν΄λž˜μŠ€κ°€ 있음

  • νŠœν”Œμ—λŠ” μ—¬λŸ¬ μ’…λ₯˜μ˜ μžλ£Œν˜•μ΄ λ‹€μ–‘ν•˜κ²Œ μ„žμ—¬ μ •μ˜λ  수 있음
func getUserInfo() -> (Int, String, Character) {
  let height = 170
  let name = "μ•Œλ¦°"
  let gender : Character = "F"
  //데이터 νƒ€μž…μ΄ String으둜 좔둠될 수 μžˆμœΌλ‹ˆκΉŒ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜ μ„ μ–Έ
  return (height, name, gender)
}
  • ν•¨μˆ˜κ°€ λ°˜ν™˜ν•˜λŠ” νŠœν”Œμ„ λŒ€μž…λ°›μ€ λ³€μˆ˜λ‚˜ μƒμˆ˜λŠ” νŠœν”Œμ˜ 인덱슀λ₯Ό μ΄μš©ν•΄μ„œ νŠœν”Œμ˜ λ‚΄λΆ€ μš”μ†Œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
var uInfo = getUserInfo()
uInfo.0 // 170
uInfo.1 // "μ•Œλ¦°"
uInfo.2 // "F"
  • νŠœν”Œ μš”μ†Œ 각각을 λ³€μˆ˜λ‘œ 직접 받을 수 있음
var (a,b,c) = getUserInfo()
a // 170
b // "μ•Œλ¦°"
c // "F"
  • 일뢀 ν•­λͺ©μ΄ ν•„μš”ν•˜μ§€ μ•Šλ‹€λ©΄ 언더바λ₯Ό μ‚¬μš©ν•΄μ„œ λ³€μˆ˜ ν• λ‹Ή 없이 κ±΄λ„ˆλ›Έ 수 있음
var (height, _, name) = getUserInfo()
  • 각 νŠœν”Œμ˜ μ•„μ΄ν…œμ„ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν• λ•Œ 미리 λ³€μˆ˜μ— ν• λ‹Ήν•΄ λ‘˜ 수 있음.
    • μ΄λ ‡κ²Œ ν•˜λ©΄ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  λ•Œ 결과값을 λ°”μΈλ”©ν•˜μ§€ μ•Šμ•„λ„ 됨
func getUserInfo() -> (h: Int, n: String, g: Character) {
  let height = 170
  let name = "μ•Œλ¦°"
  let gender : Character = "F"
  
  return (height, name, gender)
}

// κ²°κ³Όκ°’ λ³€μˆ˜ λŒ€μž…λΆ€λΆ„
var result = getUserInfo()

result.h // 170
result.n // "μ•Œλ¦°"
result.g // "F"

typealias νƒ€μž…μ•Œλ¦¬μ–΄μŠ€

  • 이름이 κΈΈκ±°λ‚˜ μ‚¬μš©ν•˜κΈ° λ³΅μž‘ν•œ νƒ€μž… ν‘œν˜„μ„ μƒˆλ‘œμš΄ νƒ€μž…λͺ…μœΌλ‘œ μ •μ˜ν•΄μ£ΌλŠ” 문법
  • νƒ€μž…μ•Œλ¦¬μ–΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ κΈΈκ³  λ³΅μž‘ν•œ ν˜•νƒœμ˜ νƒ€μž… ν‘œν˜„λ„ 짧게 쀄일 수 있음
  • νŠΉμ • νŠœν”Œνƒ€μž…μ΄ μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©λ  κ²½μš°μ—λŠ” νƒ€μž… μ•Œλ¦¬μ–΄μŠ€λ₯Ό 톡해 μƒˆλ‘œμš΄ μΆ•μ•½ν˜• νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 것이 μ’‹μŒ.
typealias <μƒˆλ‘œμš΄ νƒ€μž… 이름> = <νƒ€μž… ν‘œν˜„>
  • νƒ€μž… μ•Œλ¦¬μ–΄μŠ€ μ •μ˜ μ˜ˆμ‹œμ™€ μ‚¬μš©ν•˜λŠ” 방법
typealias userInfoResult = (Int, String, Character)
//νƒ€μž…μ•Œλ¦¬μ–΄μŠ€ μ‚¬μš© (userInfoResultλΌλŠ” νƒ€μž… 이름을 ν‘œν˜„ν•œ νŠœν”Œνƒ€μž…κ³Ό 같은 κ²ƒμœΌλ‘œ 간주함)

func getUserInfo() -> userInfoResult {
  let height = 170
  let name = "μ•Œλ¦°"
  let gender : Character = "F"
  
  return (height, name, gender)
}

//μ‚¬μš©λΆ€μ—λŠ” 아무 λ³€ν™”κ°€ μ—†λ‹€.
let info = getUserInfo()
info.0
info.1
info.2

μ‚¬μš©λΆ€λΆ„μ—λŠ” 아무 λ³€ν™”κ°€ μ—†λŠ”λ° μ‚¬μš©ν•˜λŠ” 이유?

νƒ€μž…ν‘œν˜„μ„ μƒˆλ‘œμš΄ νƒ€μž…λͺ…μœΌλ‘œ μ •μ˜ν•΄μ£ΌλŠ” 문법. 주둜 μ€‘λ³΅λ˜κ±°λ‚˜ μ‚¬μš©ν•˜κΈ° λ³΅μž‘ν•œ νƒ€μž… ν‘œν˜„μ„ μž¬μ •λ¦½ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λœλ‹€.

보톡 내뢀에 μ„ μ–Έν•˜λŠ” Nested νƒ€μž…μ„ μ€„μ—¬μ„œ μƒˆλ‘œμš΄ νƒ€μž…μ΄λ¦„μœΌλ‘œ μ€„μ—¬μ„œ ν‘œν˜„ν•˜λŠ” 정도. νŠœν”Œ 같은 ν˜•νƒœμ— 이름을 λΆ™μ—¬μ£ΌλŠ” μš©λ„.

  • νƒ€μž…μ•Œλ¦¬μ–΄μŠ€ λ₯Ό μ‚¬μš©ν•˜μ—¬ μΆ•μ•½ ν‘œν˜„ λ³€μˆ˜κ°€ 바인딩 된 νŠœν”Œμ„ μ •μ˜ν•  μˆ˜λ„ 있음
typealias userInfoResult = (h: Int, n: String, g: Character)

func getUserInfo() -> userInfoResult {
  let height = 170
  let name = "μ•Œλ¦°"
  let gender : Character = "F"
  
  return (height, name, gender)
}

let info = getUserInfo()
info.h
info.n
info.g

TIL_20171019

|

였늘 배운 / λŠλ‚€ 것

  • Swift - Optional κ°œλ…
  • Swift - μ‚Όν•­ μ—°μ‚°μž

μ•žμœΌλ‘œ ν•  것

  • 집단 μžλ£Œν˜• 곡뢀
  • μ–΄μ œ 볡슡 / μ»΄νŒŒμΌμ—λŸ¬ ν•΄κ²°
  • Githubμ—μ„œ μž¬λ―ΈμžˆλŠ” 것듀 μ°ΎκΈ° - github trending, github ranking

Optional-μ˜΅μ…”λ„ νƒ€μž…,μ˜΅μ…”λ„ 바인딩, κ°•μ œν•΄μ œ(forced unwrapping), error handling

|

μ˜΅μ…”λ„μ˜ κ°œλ…

  • 값을 λ°•μ‹±ν•˜λŠ” κ°œλ… : λ°˜ν™˜ν•˜κ³ μž ν•˜λŠ” 값을 μ˜΅μ…”λ„ 객체둜 λ‹€μ‹œ ν•œ 번 κ°μ‹ΈλŠ” κ°œλ…

  • μ–΄λ–€ ν•œ 데이터가 μžˆλŠ”λ° 그게 값이 μžˆλŠλƒ μ—†λŠλƒλ₯Ό κ΅¬λΆ„ν•˜κΈ°μœ„ν•΄μ„œ boxing함
  • λ³€μˆ˜μ— 항상 값이 μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ 둜직이 λΆˆμ•ˆμ •ν•΄μ§ˆ μœ„ν—˜μ΄ μžˆμœΌλ‹ˆκΉŒ > μŠ€μœ„ν”„νŠΈλŠ” λ³€μˆ˜μ— μ˜΅μ…”λ„νƒ€μž…μ΄λΌλŠ” 것을(μ˜΅μ…”λ„μ΄λΌλŠ” 객체) μΆ”κ°€ν–ˆλ‹€!

  • μ˜΅μ…”λ„ λ³€μˆ˜λŠ” 정상적인 λ³€ν™˜μ΄ λΆˆκ°€λŠ₯ν•œ 상황이라면 nil값을 λ°˜ν™˜ν•˜κ³  ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλœλ‹€.

  • nil은 μ•„μ˜ˆ 리턴도 μ•ˆν•˜κ³  ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ°λ²„λ¦Ό. κ·Έλž˜μ„œ μ½”λ“œμ— !κ°€ 있으면 μ€‘μš”ν•˜κ³  μœ„ν—˜ν•œ 포인트라고 감지해야함

  • 일반 μžλ£Œν˜•μ— nil은 μ–΅μ§€λ‘œ λŒ€μž…ν•  μˆ˜λ„ μ—†μŒ

μ˜΅μ…”λ„ νƒ€μž… μ„ μ–Έ

ν˜•νƒœ : λ³€μˆ˜νƒ€μž…?

// ex)String? / Int?
var optInt : Int?
var optStr : String?

// μ˜΅μ…”λ„ νƒ€μž…μ˜ λ³€μˆ˜λ‚˜ μƒμˆ˜μ—λŠ” 값도 ν• λ‹Ή κ°€λŠ₯
var optInt : Int?
optInt = 3

var optDic : [String : Int]?
optDic = ["κ΅­μ–΄" : 94, "μˆ˜ν•™" : 88, "μ˜μ–΄" : 96]

μ˜΅μ…”λ„ κ°•μ œ ν•΄μ œ 방법

  • ! : forced unwrapping. λ³€μˆ˜λͺ… μ•žμ— λŠλ‚Œν‘œλ₯Ό λΆ™μ—¬ κ°•μ œλ‘œ ν•΄μ œν•œλ‹€.
  • ν•˜μ§€λ§Œ 값이 nil이 μ•„λ‹Œμ§€ νŒλ‹¨ν•΄μ„œ 값을 ν’€μ–΄μ£ΌλŠ”κ²Œ 훨씬 μ’‹μ€λ°©λ²•μž„.
// ex) μ•ˆμ •μ μœΌλ‘œ 쑰건문 μ•ˆμ—μ„œ ν‘ΈλŠ” 방법이 있음

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber) // Int?νƒ€μž…

if convertedNumber != nil {
  print("convertedNumber has an integer value of \ (convertedNumber!).")
}

Optional binding

  • μ˜΅μ…”λ„ 바인딩은 μ˜΅μ…”λ„μ˜ 값이 μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό κ²€μ‚¬ν•œ λ’€, μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έ 값을 λ‹€λ₯Έ λ³€μˆ˜μ— λŒ€μž…μ‹œμΌœμ€€λ‹€.
//if let actual number = nil이 μ•„λ‹ˆλ©΄ λ°•μŠ€λ₯Ό ν’€μ–΄μ„œ κ°’λ§Œ λ³€μˆ˜μ— λ„£μ–΄μ£Όκ³ (actualNumber), nil인 경우 elseλ¬Έμ—μ„œ nil을 λ¦¬ν„΄ν•˜κ³  ν”„λ‘œκ·Έλž¨μ΄ λλ‚˜λ²„λ¦Ό. (μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό 해야함)

if let actualNumber = Int(possibleNumber) {
  print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
 print("\"\(possibleNumber)\" could not be converted to an integer")

Nil-coalescing

  • μ˜΅μ…”λ„ 값을 ν’€μ–΄μ£ΌλŠ” κ°œλ…μœΌλ‘œ μ‚Όν•­μ—°μ‚°μžλ₯Ό ν™œμš©ν•΄μ„œ μ“Έ 수 있음

(μ—°μ‚°μž? : 값을 확인, λ³€κ²½, κ²°ν•©ν•˜λŠ”λ° μ‚¬μš©ν•˜λŠ” νŠΉλ³„ν•œ κΈ°ν˜Έλ‚˜ 문ꡬ)

μ‚Όν•­ μ—°μ‚°μž

λ³€μˆ˜ = (bool 쑰건) ? μ°ΈμΌλ•Œ κ°’ : κ±°μ§“μΌλ•Œ κ°’

ex)

doBlindDateFlag = (point>=80) ? true : false

  • z = (a != nil) ? a! : b
    • aκ°€ nil이 μ•„λ‹ˆλ©΄ z에 λ„£μ–΄μ£Όκ³ , κ·Έ λ°˜λŒ€μ˜ κ²½μš°μ—” bλ₯Ό 넣어라

Error Handling

  • 예λ₯Όλ“€μ–΄ readline()같은 ν•¨μˆ˜λŠ” λ¦¬ν„΄νƒ€μž…μ΄ μ˜΅μ…”λ„μ΄λ‹€. μ‚¬μš©μžκ°€ 값을 μž…λ ₯ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆκΈ°λ•Œλ¬Έμ΄λ‹€.

  • 근데 μ•„μ˜ˆ λ¦¬ν„΄νƒ€μž…μ—†μ΄ throwκ°€ λΆ™μ–΄μžˆλŠ” ν•¨μˆ˜ : ν•¨μˆ˜λ₯Ό μ²˜λ¦¬ν•˜λ‹€κ°€ λ‹€ λλ‚˜κΈ° 전에 쀑간에 λΉ μ Έμ„œ ν•¨μˆ˜ν˜ΈμΆœλΆ€λ‘œ 뢈러 올 μˆ˜λ„ μžˆλ‹€λŠ” ν‘œμ‹œ

  • 이런 throwκ°€ μžˆλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν• λ•ŒλŠ” do - try - catchλ₯Ό μ‚¬μš©ν•œλ‹€.

  1. do둜 λΈ”λŸ­μ„ 감싸고
  2. tryλ₯Ό μ•žμ— λΆ™μ—¬ ν•¨μˆ˜ 호좜 - μ œλŒ€λ‘œ κ·Έ ν•¨μˆ˜(throwκ°€ λΆ™μ–΄μžˆλŠ” ν˜ΈμΆœν•œ ν•¨μˆ˜)κ°€ μ‹€ν–‰λ˜λ©΄ try둜 감싼 λ‹€μŒ ν•¨μˆ˜λ‘œ κ°€κ³ 
  3. catch - μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ (throwκ°€ λΆ™μ–΄μžˆλŠ” ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λ‹€κ°€ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„κ²½μš°)catch λΈ”λŸ­μ΄ μ‹€ν–‰λœλ‹€.