๋ค์ด๊ฐ๋ฉฐ
๊ทธ ๋์ ๋๋ฌด ์๊ฐ์์ด forEach๋ฌธ์ ์ฌ์ฉํด์๋ ๊ฒ ๊ฐ๋ค. for-in๊ณผ ๋น์ทํ ์ญํ ์ ํ๋์ง๋ ์์์ผ๋ ์ ํํ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ๊น๊ฒ ์๊ฐํด ๋ณธ ์ ์ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฒจ์๋ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ ์ธ๊ณ์๊ธฐ์ ๋ฌด์์ ์จ์์ง๋ง ์ด์ ๋ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง๋ ์ง์ด๋ณด๊ณ ๊ฐ ๋์ด์ง ์์๊น ์ถ๋ค. ๋ฉํ ๋๊ป์ ์ด๋ฌํ ๋ถ๋ถ์ ๋ํด ์ธ๊ธํด์ฃผ์ ์ ์ข์ ๊ธฐํ์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ณ ์ ํ๋ค.
for - in
var nums: [Int] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// ์ปฌ๋ ์
์ ์ฌ์ด์ฆ๋งํผ ๋ฐ๋ณต
for num in nums {
print(num)
}
// 5๋ณด๋ค ํฐ ์๋ง ์ถ๋ ฅ
for num in nums where num > 5 {
print(num)
}
// ์ง์๋ง ์ถ๋ ฅ
for num in nums where num % 2 == 0 {
print(num)
}
- ์ปฌ๋ ์ ์ ์ฌ์ด์ฆ(๊ฐฏ์, ํฌ๊ธฐ)๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋ฐ๋ณตํ๋ค.
- ์์์ num์ด๋ผ๋ ๋ถ๋ถ์ ๋ฃจํ ์์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ํด๋น ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์์ฑํ๋ฉด ๋๋ค.
for-in (with enumerated, indices)
์ฐธ๊ณ : https://babbab2.tistory.com/95
for (index, num) in nums.enumerated() {
print("(index: \\(index) num: \\(num))") // (index: 0 num: 1) (index: 1 num: 2) (index: 2 num: 3) (index: 3 num: 4)
}
for index in nums.indices {
print("(index: \\(index) num: \\(nums[index]))") // (index: 0 num: 1) (index: 1 num: 2) (index: 2 num: 3) (index: 3 num: 4)
}
for index in 0..<nums.count {
print("(index: \\(index) num: \\(nums[index]))") // (index: 0 num: 1) (index: 1 num: 2) (index: 2 num: 3) (index: 3 num: 4)
}
- ์ง์ ๋ฐ๋ณต ํ์๋ฅผ ์ง์ ํด์ค ์ ์๋ค๋ ๊ฒ์ด ํน์ง์ด๋ค.
- ๐๐ปโ๏ธ enumerated๋ ์๊ฐ๋ณด๋ค ์์ฃผ ์ฌ์ฉํ์๋ ๊ฒ ๊ฐ๋ค.
- ๋ก์ง์ ์์ฑํ๋ค๋ณด๋ฉด ์ธ๋ฑ์ค์ ๊ฐ์ ๋์์ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
- indices๋ฅผ ์ด์ฉํด ๋๊ฐ์ด ์ํ๋ ํํ๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด ์ ๊ธฐํ๋ค.
forEach
- ์ต๊ทผ์ ์ ๋ง ๋ง์ด ์ฌ์ฉํ๋ ํ์์ ์ฝ๋
- ๋ฐ๋ณตํด์ผ ํ๋ ์์
์ ํด๋ก์ ๋ก ์์ฑํด์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ ๊ฒ์ด ํน์ง์ด๋ค.
- ๋ฐ๋ณต๋ฌธ์ด ์๋๋ผ๋ ๊ฒ!
- ํด๋ก์ ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ๋ ๋ฉ์๋์ด๋ค.
- ์ปฌ๋ ์ ์ ์ ์ฅ๋ ์์๋ฅผ ํด๋ก์ ๊ฐ ๋ฐ๋ณต ์คํ๋ ๋๋ง๋ค ํด๋ก์ ์์๋ก ๋๊ฒจ์ค๋ค.
- ์์ ๊ฐฏ์ ๋งํผ ํด๋ก์ ๋ฅผ ๊ณ์ํด์ ์คํํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต ํ์์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค๋ ๊ฒ์ด ์ ๊ธฐํ๋ค.
- ์จ์ ํ ๋ฐ๋ณต์ ๋ค ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ๋ฏ ํ๋ค.
์ฐธ๊ณ : https://babbab2.tistory.com/95
let nums: [Int] = [1, 2, 3, 4]
nums.forEach {
print($0) // 1 2 3 4
}
- enumerated์ indices์ ๊ฐ์ด ์ฐ์ผ ์ ์๋ค๋ ๊ฒ์ ์ฒ์ ์์๋ค. (์๊ฐํด๋ณด๋๊น ๋๋ฌด ๋น์ฐํ๋ ๊ฒ..)
nums.enumerated().forEach {
print("(index: \\($0) num: \\($1))") // (index: 0 num: 1) (index: 1 num: 2) (index: 2 num: 3) (index: 3 num: 4)
}
nums.indices.forEach {
print("(index: \\($0) num: \\(nums[$0]))") // (index: 0 num: 1) (index: 1 num: 2) (index: 2 num: 3) (index: 3 num: 4)
}
- ๋์ ๋๋ฆฌ ๋ถ๋ถ์ด ๊ฝค๋ ์ฌ๋ฐ์๋ค.
let dict: [String : String] = ["A" : "Apple", "B" : "Banana", "C" : "Cherry"]
dict.forEach {
print("(\\($0.key) : \\($0.value))") // (B : Banana) (C : Cherry) (A : Apple)
}
dict.forEach { (key, value) in
print("(\\(key) : \\(value))") // (C : Cherry) (A : Apple) (B : Banana)
}
dict.keys.forEach {
print($0) // B C A
}
dict.values.sorted().forEach {
print($0) // Apple Banana Cherry
}
map๊ณผ forEach?
์ฐธ๊ณ : https://hyerios.tistory.com/10
2๊ฐ์ง๊ฐ ๋น์ทํ๋ค๊ณ ์๊ฐํด๋ณธ ์ ์ ์์๋๋ฐ, ์ฌ์ค์ ๋์ผํ ์ญํ ์ ํ๊ณ ์๋ค๋ผ๋ ๊ฒ์ ์ ๋ธ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด์ ๊นจ๋ฌ์๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. โ map์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฌ์ฉํ๊ณ , forEach๋ ๋ฆฌํด ๊ฐ ํ์์์ด ๊ฐ ์์์ ์ฃผ์ด์ง ํด๋ก์ ๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
map๋ ๊ฐ ์์์ ๋ฐ๋ผ ํด๋ก์ ๋ฅผ ํธ์ถํ๊ณ , forEach ์ญ์ ๊ฐ ์์์ ๋ฐ๋ผ ํด๋ก์ ๋ฅผ ํธ์ถํ๋ค. ์ฐจ์ด์ ์ด๋ผ๊ณ ํ๋ค๋ฉด์ Return์ ํ๋, ์ํ๋์ ์ฐจ์ด์ด๋ค. map์ ํด๋ก์ ๋ฅผ ํธ์ถํ ๋ค ์ปฌ๋ ์ ์ ๋ค์ Return์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฌ์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๊ณ , forEach๋ Return์ ๋ฐ๋ก ํด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฌ์ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
for-in๊ณผ forEach
์ฐธ๊ณ : https://jaeho4646.tistory.com/442
// ๋๊ฐ์ง ํจ์๋ฅผ ์ด์ฉํด ์ด๊ฑฐ
// 1. ๋ฐฐ์ด์ ์ด๊ฑฐ
func withForIn() {
print(#function)
let arr = [1, 2, 3]
for num in arr {
// break
// coutinue
print(num)
return
}
}
func withForeach() {
print(#function)
let arr = [1, 2, 3]
arr.forEach { (num) in
// break, continue ์ฌ์ฉ๋ถ๊ฐ -> ๋ฐ๋ณต๋ฌธ์ด ์๋๊ธฐ ๋๋ฌธ์
print(num)
return
}
}
withForIn() // returnํ ๊ฒฝ์ฐ ํจ์ ์ ์ฒด๊ฐ ์ข
๋ฃ
withForeach() // returnํ ๊ฒฝ์ฐ ํ์ฌ ์คํ์ค์ธ ํด๋ก์ ํ๋๋ง ์ข
๋ฃ (๋ฐ๋ณตํ์์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.)
- ๊ฐ์ธ์ ์ธ ์๊ฐ์ผ๋ก๋ ๋ฐ๋ณต ์ค๊ฐ์ return์ ์ฃผ์ด ๋ฉ์๋๋ ์ด๋ค ์ก์ ์ ์คํ์ด ์ค๋จ๋์ด์ผ ํ๋ ์์ ์ด ์๋ค๋ฉด for-in์ ์ฌ์ฉ์ด ์ ์ ํ ๊ฒ ๊ฐ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ทธ๋ฅ forEach๋ฅผ ์ฌ์ฉํด๋ ๋ ๊ฒ ๊ฐ๋ค.
๋ด๊ฐ ์งฐ๋ ์ฝ๋
for - in
- ๋ฐ์์จ ์ค์ผ์ค ์์ดํ ๋ค์ ์ญ ๋ณด๋ฉด์, ํน์ ์กฐ๊ฑด์ ๋ง๋ ์ค์ผ์ค์ ์ํ๋ ๋ฐฐ์ด์ ๋ด๋ ํํ์ ์ฝ๋์๋ค.
- ์์์ map๊ณผ forEach? ๋ถ๋ถ์์ ๋ณด์๋ ๊ฒ์ฒ๋ผ ์๋์์ 2๊ฐ์ง ์ฝ๋ ์์๋ฅผ ๋ชจ๋ ํ์ธํ ์ ์๋ค.
- map์ ์ผ๋ ๋ถ๋ถ์ items๋ก Return์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ทธ ์ฌ์ฉ์ด ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ค.
func parseSchedules() {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = Date.FormatType.full.description
// 1
let items = scheduleItems.map { [dateFormatter.date(from: $0.scheduleDate) as Any, $0.isComplete] }
// 2. ์ง๊ธ์ for-in์ผ๋ก ์์ฑ๋์ด ์์ง๋ง forEach๋ก๋ ์์ฑํ ์ ์์ ๊ฒ ๊ฐ๋ค.
for item in items {
guard let scheduleDate = item[0] as? Date else { return }
guard let isComplete = item[1] as? String else { return }
if isComplete == "doing" {
doingDates.append(scheduleDate.toString(of: .year))
} else if isComplete == "done" {
doneDates.append(scheduleDate.toString(of: .year))
}
}
}
forEach
- TabBarItem.allCases๊ฐ๊ฐ์ ์ด๊ฑฐํ์ ํด๋ก์ ์์๋ก ๋๊ฒจ์ฃผ๋ฉด์ ๊ฐ๊ฐ ์์ ์ ์ํํ๊ณ ์๋ค.
- ์ด๋ถ๋ถ์ ๋ณด๋ฉด ์ด๊ฑฐํ์ ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ปฌ๋ ์ ์ ํํ๋ก ๋ฐํํด์ฃผ๊ธฐ ๋๋ฌธ์ forEach๋ฌธ์ด ์คํ์ด ๊ฐ๋ฅํ๋ค.
private func setTabBarItems() {
tabs = [
UINavigationController(rootViewController: HomeViewController.instanceFromNib()),
UINavigationController(rootViewController: ShareViewController.instanceFromNib()),
UINavigationController(rootViewController: NoticeViewController.instanceFromNib()),
UINavigationController(rootViewController: UIViewController())
]
TabBarItem.allCases.forEach {
tabs[$0.rawValue].tabBarItem = $0.asTabBarItem()
tabs[$0.rawValue].tabBarItem.tag = $0.rawValue
}
setViewControllers(tabs, animated: true)
}
์คํ ์์ค์์ ์ฐพ์๋ณธ ์ฝ๋
kingfisher์์ ์ฐพ์๋ณธ forEach๋ฌธ
- 0..<frameCount์๋ค๊ฐ ๋ฐ๋ก forEach๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฒ ์ ๊ธฐํ๋ค.
- https://developer.apple.com/documentation/swift/range
- ์์ ๋ฌธ์์์๋ณด๋ฉด Range๋ฅผ ์ฐ์ ๊ฐ์ ์ปฌ๋ ์
์ผ๋ก ์ฌ์ฉ ์ด๋ผ๊ณ ์ ํ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ์ฐ๋ฆฌ๊ฐ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์๋ฌด๋ฐ ์์ฌ ์์ด ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋๋์ธ ๊ฒ ๊ฐ๋ค.
- // ์ฌ๊ธฐ์์ 3..<5๋ ๊ฒฐ๊ตญ ํ๋์ ์ปฌ๋ ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
- for n in 3..<5 { print(n) }
- // Prints "3"
- // Prints "4"
- ์ธ๋ฑ์ค ํ์๋งํผ ํด๋ก์ ๋ฅผ ์คํ์์ผ์ฃผ๊ณ ์ถ์ด์ ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค.
private func setupAnimatedFrames() {
resetAnimatedFrames()
var duration: TimeInterval = 0
(0..<frameCount).forEach { index in
let frameDuration = GIFAnimatedImage.getFrameDuration(from: imageSource, at: index)
duration += min(frameDuration, maxTimeStep)
animatedFrames.append(AnimatedFrame(image: nil, duration: frameDuration))
if index > maxFrameCount { return }
animatedFrames[index] = animatedFrames[index]?.makeAnimatedFrame(image: loadFrame(at: index))
}
self.loopDuration = duration
}
NotionDrive๋ผ๋ ํ๋ก์ ํธ์์ ๋ณธ for-in๋ฌธ
https://github.com/underthestars-zhy/NotionDrive/blob/main/Sources/NotionDrive/NotionDrive.swift
- enumerated()์ฌ์ฉ์ด ์ ๋์ด์๋ ๊ฒ ๊ฐ์์ ๊ฐ์ ธ์๋ดค์
for (count, subData) in subDatas.enumerated() {
let subRequest = PageCreateRequest(
parent: .page(page.id),
properties: [
"title": .init(
type: .title([
.init(string: "\\(count)")
])
),
]
)
let subPage = try await notion.pageCreate(request: subRequest)
for (count, _subData) in subData.enumerated() {
let subRequest = PageCreateRequest(
parent: .page(subPage.id),
properties: [
"title": .init(
type: .title([
.init(string: "\\(count)")
])
),
],
children: [
.init(type: .paragraph(.init(text: [.init(string: _subData)])))
]
)
_ = try await notion.pageCreate(request: subRequest)
}
}
์๋ณต์๋ณต ํ๋ก์ ํธ(์ฌ์ด๋ ํ ํ๋ก์ ํธ)์์ ์ฌ์ฉํ ์ฝ๋
// FSCalendar ์ฌ์ฉํ ๋
private func configureVisibleCells() {
calendar.visibleCells().forEach { (cell) in
let date = calendar.date(for: cell)
let position = calendar.monthPosition(for: cell)
self.configure(cell: cell, for: date!, at: position)
}
}
๋ง๋ฌด๋ฆฌ
- ์๊ฐ๋ณด๋ค ์คํ์์ค ์ฐพ์๋ณด๋๋ฐ ๊ฐ์ฅ ํฌ๊ฒ ๋ ์๊ฐ์ ๊ณผ์ฅํด์ ์ฝ๋์ 70-80%๋ if๋ฌธ๊ณผ switch๋ฌธ์ผ๋ก ์ด๋ฃจ์ด์ง์ง ์์๋๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
- for-in๊ณผ forEach์ ์ฐจ์ด๋ฅผ ์์์ ์ข์๋ค.
- map๊ณผ forEach๋ฅผ ๋น๊ตํด๋ณผ ์ ์์ด์ ์ข์๋ค.
- for-in๊ณผ forEach์ ํจ๊ป enumerated(), indices, where๋ฌธ์ ์ฎ์ด๋ณผ ์ ์๊ฒ ๋ค๋ผ๋ ์๊ฐ์ด ๋ค์ด์ ์ข์๋ค. (enumerated๋ ํ์ด์ฌ์์ ์ฐ๋ ์ต๊ด ๋๋ฌธ์ ์ข ์ข ์ฐ๊ธด ํ์ง๋ง..)
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[WWDC21] SheetViewController (Session. Customize and resize sheets in UIKit) (0) | 2022.08.02 |
---|---|
Enum์ ํ์ฉํด TableViewController ๊ตฌ์ฑํ๊ธฐ (1) | 2022.07.19 |
์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ Contributor ๋์ด๋ณด๊ธฐ(with FSCalendar) (10) | 2022.07.14 |
Raw Strings (0) | 2022.07.13 |
Image Rendering Mode (Original Image vs Template Image) (0) | 2022.07.12 |