[TIL] 2021.04.12 (Mon)

Youngwoo Lee·2021년 4월 16일
0

TIL

목록 보기
19/29
post-thumbnail

오늘의 공부 Keywords

  • ViewController 간의 데이터 주고 받기
  • 고차 함수

Kahoot

Content Configuration

→ iOS14부터 Cell의 각 UI요소에 직접 접근하여 콘텐츠를 설정하는 대신, Content Configuration을 사용하여 콘텐츠를 나타낸다

VoiceOver 기능을 통해 읽어주는 accessibility property

→ label, title, value, type




ViewController 간의 데이터 주고 받기

  • 직접 주고 받기 (Navigation Controller) , Present 또한 가능
let storyboard = UIStoryboard(name: "Main", bundle: .main)
guard let itemInfoViewController = storyboard.instantiateViewController(identifier: "itemInfoVC") as? ItemInfoViewController else {
    return
}

itemInfoViewController.paramTitle = self.itemsData[indexPath.row].name
itemInfoViewController.paramImage = self.itemsData[indexPath.row].imageName
itemInfoViewController.paramDescription = self.itemsData[indexPath.row].description
self.navigationController?.pushViewController(itemInfoViewController, animated: false)
  • 세그웨이를 이용하여 직접 주고받기

매뉴얼 세그웨이나 액션 세그웨이에 구분 없이 모든 세그웨이가 실행되기 전에 iOS는 prepare(for: sender:) 메소드를 먼저 호출한다

//Segue identifier : ManualSegue
@IBAction func onPerformSegue(_ sender: Any) {
	self.performSegue(withIdentifier: "ManualSegue", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
	let dest = segue.destination // 목적지 ViewController
	guard let viewController = dest as? ItemInfoViewController else {
		return
	}
	viewController.paramTitle = self.titleLabel.text
	viewController.paramImage = self.imageView.image
	viewController.paramDescription = self.descLabel.text
  • presentingViewController & presentedViewController

    presentingViewController : 자신을 호출한 ViewController

    presentedViewController : 자신이 호출한 ViewController

  • AppDelegate 객체에 값을 주고받기

//AppDelegate.swift
var items: [Item]?
var expo: Exposition?

--------------------
//ExpositionViewController.swift
override func viewDidLoad() {
	decodeData()
}

private func decodeData() {
	guard let dataAsset: NSDataAsset = NSDataAsset(name: "exposition_universelle_1900", bundle: .main) else {
		return
	}
	do {
		let ad = UIApplication.shared.delegate as? AppDelegate
		ad?.expo = try JSONDecoder().decode(Exposition.self, from: dataAsset.data)
	} catch {
		implementErrorAlert(ExpoError.invalidExpoData)
	}
}
  • UserDefaults 객체를 사용하여 값을 주고받기
//ExpositionViewController.swift
override func viewDidLoad() {
	decodeData()
}

private func decodeData() {
	guard let dataAsset: NSDataAsset = NSDataAsset(name: "exposition_universelle_1900", bundle: .main) else {
		return
	}
	do {
		let ud = UserDefaults.standard
		let result = try JSONDecoder().decode(Exposition.self, from: dataAsset.data)
		ud.set(result, forKey: "exposition")
	} catch {
		implementErrorAlert(ExpoError.invalidExpoData)
	}
}
  • 코어 데이터에 저장하고 값을 주고받기
// 공부 중...
  • Delegate 패턴 사용하기
  • NotificationCenter 사용하기



고차함수

고차함수를 하기 전에 일단 closure에 대한 이해가 필요하다

closure
일급 객체이자, 함수명이 없는 함수

일급객체?? 위키 - 일급객체

  • 매개변수로 사용할 수 있음
  • 반환 값으로 사용할 수 있음
  • 변수나 데이터에 할당할 수 있음

→ 축약시 너무 많이 줄이면 (타입을 생략) ⇒ 컴파일러가 컴파일하는 시간이 늘어난다

  • map

컬렉션 내부의 기존 데이터를 변형(transform)하여 새로운 컬렉션 생성

container.map(f(x)) 컨테이너의 map 메서드 호출 → return f(container의 각 요소) 새로운 컨테이너

→ 1:1 mapping 된다

  • filter

컨테이너 내부의 값을 걸러서 추출

  • reduce

컨테이너 내부의 콘텐츠를 하나로 통합 (이름이 마음에 안든다...)

for 문으로 내부 콘텐츠 통합할 경우와의 차이점은???

let numbers: [Int] = [2,8,15]

//for의 경우
var sum: Int = 0 // 변수로 선언해줘야 한다
for number in numbers {
	sum += number
}
print(sum) // 25

//reduce의 경우
let sum: Int = numbers.reduce(0, { (first: Int, second: Int) -> Int in
	return first + second
}) // 상수로 선언해줄 수 있다
print(sum) // 25
  • flatMap, compactMap
let optionals = [1, 2, nil, 4, nil, 5]
let result = optionals.compactMap { $0 }
print(result) // [1,2,4,5]

apple/swift-evolution

해당 링크를 통해서 왜 compactMap과 flatMap을 나누었는지 알아보자!!

profile
iOS Developer Student

0개의 댓글