πŸ’‘ Swift κΈ°λ³Έ 문법 (1)

μ •λ‚˜μ˜Β·2022λ…„ 10μ›” 7일
0

πŸ“Ž λ³€μˆ˜μ™€ μƒμˆ˜

λ³€μˆ˜(variable)λŠ” 값을 μˆ˜μ •ν•  수 있고, μƒμˆ˜(constant)λŠ” μˆ˜μ • λΆˆκ°€

var name = "nang"
let birthyear = 1999

SwiftλŠ” 정적 타이핑 μ–Έμ–΄
λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό μ •μ˜ν•  λ•Œ μžλ£Œν˜•(νƒ€μž…)을 λͺ…μ‹œν•΄μ£Όμ–΄μ•Ό 함

var name: String = "nang"
let birthyear: Int = 1999
var height: Float = 163.0
birthyear + height //컴파일 μ—λŸ¬
Float(birthyear) + height

String(birthyear) + "년에 νƒœμ–΄λ‚œ " +name+ "!"
🟰
"\(birthyear) 년에 νƒœμ–΄λ‚œ \(name)!"

πŸ“Ž νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜(Type Annotation)
: λ³€μˆ˜λ‚˜ μƒμˆ˜ 이름 뒀에 콜둠(:)을 뢙이고 μžλ£Œν˜•μ„ μ¨μ£ΌλŠ” 것

πŸ“Ž νƒ€μž… μΆ”λ‘  (Type Inference)
: νƒ€μž…μ„ 직접 λͺ…μ‹œν•˜μ§€ μ•Šκ³ λ„ 값을 가지고 정적 타이핑을 ν•  수 있게 ν•˜λŠ” 것

  • " " 둜 감싸진 ν…μŠ€νŠΈλŠ” String νƒ€μž…μž„μ„, μˆ«μžλŠ” Int νƒ€μž…μž„μ„ 인식

πŸ“Ž λ°°μ—΄κ³Ό λ”•μ…”λ„ˆλ¦¬

λ°°μ—΄κ³Ό λ”•μ…”λ„ˆλ¦¬ λͺ¨λ‘ λŒ€κ΄„ν˜Έ([])λ₯Ό μ‚¬μš©ν•΄μ„œ μ •μ˜

var languages = ["Swift", "Objective-C", "Python"]
var capitals = [
	"ν•œκ΅­" : "μ„œμšΈ",
    "일본" : "도쿄",
    "쀑ꡭ" : "베이징",
]

λ°°μ—΄κ³Ό λ”•μ…”λ„ˆλ¦¬μ— μ ‘κ·Όν•˜κ±°λ‚˜ 값을 λ³€κ²½ν•  λ•Œμ—λ„ λŒ€κ΄„ν˜Έ μ‚¬μš©

languages[0]
languages[1] = "Ruby"

capitals["ν•œκ΅­"]
capirals["ν”„λž‘μŠ€"] = "파리"

πŸ’‘ μ°Έκ³ 
λ°°μ—΄κ³Ό λ”•μ…”λ„ˆλ¦¬λ₯Ό let으둜 μ •μ˜ν•˜λ©΄ κ°’ μˆ˜μ • λΆˆκ°€

languages 와 capitals의 νƒ€μž…

var languages: [String] = ["Swift", "Objective-C", "Python"]
var capitals: [String: String] = [
	"ν•œκ΅­" : "μ„œμšΈ",
    "일본" : "도쿄",
    "쀑ꡭ" : "베이징",
]

빈 λ°°μ—΄μ΄λ‚˜ 빈 λ”•μ…”λ„ˆλ¦¬ μ •μ˜

var languages: [String] = []
var capitals: [String: String] = [:]

or

var languages = [String]()
var capitals = [String: String]()

πŸ“Ž 쑰건문과 반볡문

var age = 24
var student = ""

if age >= 8 && age < 14 {
	student = "μ΄ˆλ“±ν•™μƒ"
} else if age < 17 {
	student = "쀑학생"
} else if age < 20 {
	student = "고등학생"
} else {
	student = "기타"
}

student //기타

if 문의 μ‘°κ±΄μ ˆμ—λŠ” 값이 μ •ν™•ν•˜κ²Œ μ°Έ λ˜λŠ” κ±°μ§“μœΌλ‘œ λ‚˜μ˜€λŠ” Bool νƒ€μž… μ‚¬μš©

var number = 0
if !number { //컴파일 μ—λŸ¬
}
if number == 0 {
	//
}

빈 λ¬Έμžμ—΄μ΄λ‚˜ 배열을 검사할 λ•Œμ—λ„ 길이가 0인지 검사

if name.isEmpty {...}
if languages.isEmpty {...}

switchλ¬Έ: Swift의 switch ꡬ문은 νŒ¨ν„΄ 맀칭이 κ°€λŠ₯

switch age {
case 8.. < 14:
	student = "μ΄ˆλ“±ν•™μƒ"
case 14.. < 17:
	student = "쀑학생"
case 17.. < 20:
	student = "고등학생"
default:
	student = "기타"
}

for,while : λ°˜λ³΅λ˜λŠ” 연산을 ν•  λ•Œ μ‚¬μš©

for language in languages {
	print("μ €λŠ” \(language) μ–Έμ–΄λ₯Ό λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.")
}

for (country, capital) in capitals {
	print("\(country)의 μˆ˜λ„λŠ” \(capital)μž…λ‹ˆλ‹€.")
}

반볡문 λ§Œλ“€κΈ°

for i in 0..<100 {
	i
}
for _ in 0..<10 {
	print("Hello")
}
var i = 0
while i < 100 {
	i += 1
}

πŸ“Ž μ˜΅μ…”λ„ (Optional)
: 값이 μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλŠ” 것

nil : 값이 μ—†λŠ” 경우 μ‚¬μš©

var name: String = "nang"
name = nil //컴파일 μ—λŸ¬

값이 μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλŠ” λ³€μˆ˜λ₯Ό μ •μ˜ν•  λ•Œμ—λŠ” νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ— ?λ₯Ό λΆ™μž„
μ΄λ ‡κ²Œ μ •μ˜ν•œ λ³€μˆ˜κ°€ μ˜΅μ…”λ„
μ˜΅μ…”λ„μ— μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 기본값은 nil

var email: String?
print(email) //nil

email = "https://github.com/nang518"
print(email) //Optional("https://github.com/nang518")

μ˜΅μ…”λ„λ‘œ μ •μ˜ν•œ λ³€μˆ˜λŠ” μ˜΅μ…”λ„μ΄ μ•„λ‹Œ λ³€μˆ˜μ™€ 닀름

let optionalEmail: String? = "https://github.com/nang518"
let requiredEmail: String = optionalEmail //컴파일 μ—λŸ¬

requiredEmail λ³€μˆ˜λŠ” String이기 λ•Œλ¬Έμ— 항상 값을 가지고 μžˆμ–΄μ•Ό ν•˜λŠ” 반면,
optionalEmail 은 μ˜΅μ…”λ„λ‘œ μ„ μ–Έλœ λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ— μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „κΉŒμ§€λŠ” κ°’μ˜ 유무λ₯Ό μ•Œ 수 μ—†μŒ

πŸ“Ž μ˜΅μ…”λ„ 바인딩 (Optional Binding)
: μ˜΅μ…”λ„μ˜ 값을 κ°€μ Έμ˜€κ³  싢은 경우 μ‚¬μš©

if let email = optionalEmail {
	print(email) //optionalEmail의 값이 μ‘΄μž¬ν•˜λŠ” 경우 ν•΄λ‹Ή κ°’ 좜λ ₯
} //값이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ if λ¬Έ νƒˆμΆœ

ν•˜λ‚˜μ˜ if λ¬Έμ—μ„œ 콀마(,)둜 κ΅¬λΆ„ν•˜μ—¬ μ—¬λŸ¬ μ˜΅μ…”λ„ 바인딩 κ°€λŠ₯

var optionalName: String? = "nang"
var optionalEmail: String? = "https://github.com/nang518"

if let name = optionalName, email = optionalEmail {
	//nameκ³Ό email κ°’ 쑴재
}

πŸ’‘μ°Έκ³ 
μ½”λ“œκ°€ λ„ˆλ¬΄ κΈΈ κ²½μš°μ—λŠ”, μ—¬λŸ¬ 쀄에 κ±Έμ³μ„œ μ‚¬μš©
λ‘λ²ˆμ§Έ let λΆ€ν„°λŠ” μƒλž΅ κ°€λŠ₯

if let name = optionalName,
	let email = optionalEmail {
    //nameκ³Ό email κ°’ 쑴재
}

μ˜΅μ…”λ„ 바인딩 ν•  λ•Œ ,λ₯Ό μ‚¬μš©ν•˜μ—¬ 쑰건 ν•¨κ»˜ 지정 κ°€λŠ₯

var optionalAge: Int? = 24

if let age = optionalAge, age>=20 {
	//age의 값이 μ‘΄μž¬ν•˜κ³ , 20 이상
}

🟰

if let age = optionalAge {
	if age >= 20 {
    	//age의 값이 μ‘΄μž¬ν•˜κ³ , 20 이상
    }
}

πŸ“Ž μ˜΅μ…”λ„ 체이닝 (Optional Chaining)
: μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ λ§Œλ“€μ–΄μ£ΌλŠ” 것

let array: [String]? = []
var isEmptyArray = false

if let array = array, array.isEmpty {
	isEmptyArray = true
} else {
	isEmptyArray = false
}

isEmptyArray

🟰

let isEmptyArray = array?.isEmpty == true

-> μ˜΅μ…”λ„ 체이닝은 μ˜΅μ…”λ„ 속성에 μ ‘κ·Όν•  λ•Œ,
μ˜΅μ…”λ„ 바인딩 과정을 ? ν‚€μ›Œλ“œλ‘œ μ€„μ—¬μ£ΌλŠ” μ—­ν• 

πŸ“Ž μ˜΅μ…”λ„ λ²—κΈ°κΈ°
: 값이 μ‘΄μž¬ν•  κ²ƒμž„μ—λ„ λΆˆκ΅¬ν•˜κ³  μ˜΅μ…”λ„λ‘œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우, 값이 μžˆλ‹€κ³  κ°€μ •ν•˜κ³  값에 λ°”λ‘œ μ ‘κ·Όν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” ν‚€μ›Œλ“œ (!) μ‚¬μš©

print(optionalEmail) //Optional("https://github.com/nang518")
print(optionalEmail!) //https://github.com/nang518

β—οΈμ£Όμ˜
μ˜΅μ…”λ„μ˜ 값이 nil인 κ²½μš°μ—λŠ” λŸ°νƒ€μž„ μ—λŸ¬ λ°œμƒ

πŸ“Ž μ•”λ¬΅μ μœΌλ‘œ 벗겨진 μ˜΅μ…”λ„ (Implicitly Unwrapped Optional)
: μ˜΅μ…”λ„μ„ μ •μ˜ν•  λ•Œ ? λŒ€μ‹  ! λΆ™μž„

var email: String! = "https://github.com/nang518"
print(email)

μ ‘κ·Όν•  λ•Œ μ˜΅μ…”λ„ λ°”μΈλ”©μ΄λ‚˜ μ˜΅μ…”λ„μ„ λ²—κΈ°λŠ” κ³Όμ • 없이 λ°”λ‘œ 값에 μ ‘κ·Ό κ°€λŠ₯
값이 μ—†λŠ”λ° 접근을 μ‹œλ„ν•˜λ©΄ λŸ°νƒ€μž„ μ—λŸ¬ λ°œμƒ

0개의 λŒ“κΈ€