100 days of Swift - Day 27

sun02·2021년 9월 17일
0

100 days of Swift 

목록 보기
24/40

if let startWordURL = Bundle.main.url(forResource: "start", withExtension: "txt") {
	if let startWords = try? String(contentsOf: startWordsURL) {
    	allWords = startWords.components(seperatedBy: "\n")
    }
}

if allWords.isEmpty {
	allWords = ["silkworm"]
}
  • Bundle의 내장 메소드를 이용하여 파일의 위치를 찾는다

    • forResource : 파일 이름, withExtension: 확장자
  • String(ContentsOf: startWordsURL) : 파일을 문자열로 로드하기 위해서 String 인스턴스를 만들때 특정 경로의 파일에서 생성하도록 요청한다.

  • try? : "이 코드를 호출하고 만약 오류가 발생하면 nil을 보내줘"

  • path(forResource:)나 파일내용에서 String을 생성하는 것이나 모두 String?을 반환하기 때문에 if let 구문을 사용하여 언래핑해야한다.


@objc func promptForAnswer() {
	let ac = UIAlertController(title: "Enter answer", message: nil, preferredStyle: .alert)
    ac.addTextField()
    
    let submitAction = UIAlertAction(title: "Submit", style: .default) { [weak self, weak ac] action in
    	guard let answer = ac?.textFields?[0].text else { return }
        self?.submit(answer)
        
    }
    
    ac.addAction(submitAction)
    present(ac, animated: true)
    
}
  • @objc : UIBarButtonItem에서 호출될 것이기 때문에 @objc 를 붙여줘야한다.

  • ac.addTextField() : UIAlertController에 텍스트필드를 추가하는 메서드

  • let submitAction(title, style) { }

    • { } : 후행 클로져로 메서드가 호출 된 이후 실행되었으면 하는 코드를 전달한다.
  • action in : UIAlertAction 유형의 매개변수 하나를 허용한다는 의미

    • in 앞의 것들은 클로져를 설명하고, in 뒤의 것들은 그것이 클로져이다.
    • action 매개변수에 대한 이름을 만들 필요는 없다. '_ in' 처럼 표현 가능
  • [weak self, weak ac] : self(현재 뷰 컨트롤러), ac(UIAlertController)를 약한 참조로 선언

  • self.submit() : submit 메서드는 클로져 밖에 있으므로 클로져가 뷰 컨트롤러를 캡쳐하지 않으면 submit()을 호출할 수 없다.

    • textFields[0] : addTextField()메서드를 사용하여 텍스트 필드를 추가하였으므로 삽입된 값을 읽는다.

0개의 댓글