소멸 위원회

14742 단어 iOSSwifttech
거짓말이었어불멸
그러나 기대의 전제조건이 충족되지 않는다고 해서 쉽게 물러나거나 복귀할 수는 없다.
guard~else return은 심사숙고해서 사용해야 합니다.

nil 검사 리턴 낭비


다음 코드는 URL 생성에 실패했는지 이중 언어로 확인하고 실패한 경우 반환합니다.
func example() -> String? {
    guard let url = URL(string: "https://example.com/") else {
        return nil
    }
    var result: String = /* なんか処理する */
    return result
}
URL에 맡긴 intializer가 소양이라면 절대 실패하지 않을 거라는 걸 알기 때문에 이중 언어가 필요 없다.더욱이 이 때문에 반환 값을 Optional로 설정하는 것만으로도 나쁜 점이 있을 뿐이다.
func example() -> String {
    let url = URL(string: "https://example.com/")!
    var result: String = /* なんか処理する */
    return result
}
진지하게 시도!사용 가능합니다.
그러나 프로그램 외부에서 URL 문자열을 입력할 때는 nil 검사를 수행해야 합니다.UIImage(named: String) 등도 같은 방법을 쓸 수 있다.

매개 변수 검사 반환


다음 코드는 이중 언어에서 파라미터를 검사하고 원하는 조건이 충족되지 않으면 되돌려줍니다.
func example(num: Int?, urlString: String) {
    guard let num = num, let url = URL(string: urlString) else {
        return
    }
    // 何か処理する
}
우선 가장 큰 문제는 처리 실패가 어느 곳에도 전달되지 않았다는 것이다.이것은 유형의 오류를 알아차리기 어려운 온상이다.
반환값이 있는 방법return nil도 많다.이 경우 호출자는 실패를 검출할 수 있지만, 되돌아오는 값을 Optional로 설정하는 것을 최대한 피할 수 있다.
물론 이런 모델은 매개 변수 유형의 조건을 엄격하게 요구하기 때문에 호출자 검사를 통해 간단하게 개선할 수 있다.
func example(num: Int, url: URL) {
    // 何か処理する
}
상황에 따라 독자적인 struct를 정의할 수도 있다.

내부 상태 확인


다음 코드에서excuteWork에 필요한state를 검사하고 nil이면 되돌려줍니다.
class Example {
    private var state: Int?
    
    private func executeWork() {
	guard let state = state else {
	    return
	}
	// 何か処理する
    }
    
    func otherMethod() {
        self.state = /* state準備 */
	executeWork()
    }
    ...
}
이 모델에서 우선excuteWork는state가nil의 상황을 정상적인 상태로 수리하는지 부당한 상태로 처리해야 하는지를 명확히 해야 한다.
다음에 만약 nil이 올바르지 않은 상태라면 호출자state가 존재하는 보증을 요구해야 합니다.
그 방법 중 하나는 비 Optional 인자를 요구하는 것이다.순조롭다면 실례에서mutable 상태를 줄일 수 있다.
class Example {
    private func executeWork(state: Int) {
	// 何か処理する
    }
    
    func otherMethod() {
        let state = /* state準備 */
	executeWork(state: state)
    }
    ...
}
위와 같은 예쁜 방법은 어려운 상황에서 이상적인 방법은 아니지만 state는 닐의 경우 사용할 수 없는 방법이라는 명확한 주장이 있다.
class Example {
    private var state: Int?
    
    private func executeWork() {
	precondition(state != nil)
	// 何か処理する
    }
    
    func otherMethod() {
        self.state = /* state準備 */
	executeWork()
    }
    ...
}

런타임 오류 확인


다음 코드는 파일에서 문자열을 불러옵니다. 실패하면 되돌아옵니다.
func example(fileURL: URL) {
    guard let content = try? String(contentsOf: fileURL, encoding: .utf8) else {
        return
    }
    // なんか処理する
}
파일, 네트워크 등이 실행될 때의 오류를 완전히 배제할 수 없는 경우 실패할 때의 지점을 배제할 수 없다.위의 예는 아마 그렇게 throw가 좋을 것이다.
func example(fileURL: URL) throws {
    let content = try String(contentsOf: fileURL, encoding: .utf8)
    // なんか処理する
}
실패할 때throw가 아니라nil로 되돌아오는 방법을 사용하더라도guard~elsethrow로 변경함으로써 의도가 더욱 명확해지는 경우가 있어 논의할 가치가 있다.

할 때


나는 이중 언어를 어떻게 피해야 할지 고민해 왔다. 물론 이중 언어를 사용해야 할 때도 있다.
그러나 평론에서는 단순한 리턴이 아니라 심사숙고한 끝에 선택한 결과라고 주장하며 읽는 사람에게 부드럽게 대한다.
func example() {
    guard let state = self.state else {
        // この場合は○○のため何もしない
        return
    }
    // 他の処理
}

// ○○を行う。○○の場合はnilを返す
func example2() -> String? {
    guard let state = self.state else {
        return nil
    }
    // 他の処理
}

총결산


중요한 요점은 방법이 매개 변수와 실례의 상태를 처리 대상으로 받아들일지 여부를 명확히 하는 것이다.
처리 대상으로 받아들인다면 모든 지점에 부당한 상태가 발생하지 않도록 꼼꼼히 설계해야 한다.반면 받아들이지 않으면 형식이나 precondition 등을 사용해 명확하게 거부해야 한다.
코드에서는 이미 수락했지만 처리할 수 없으니 적당한 회답을 피하세요.

좋은 웹페이지 즐겨찾기