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의 내장 메소드를 이용하여 파일의 위치를 찾는다
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 유형의 매개변수 하나를 허용한다는 의미
[weak self, weak ac] : self(현재 뷰 컨트롤러), ac(UIAlertController)를 약한 참조로 선언
self.submit() : submit 메서드는 클로져 밖에 있으므로 클로져가 뷰 컨트롤러를 캡쳐하지 않으면 submit()을 호출할 수 없다.