ProgramingTip

Xcode 8 : 함수 유형은 내 빌드를 깨는 인수를 생산할 수 없습니다.

bestdevel 2020. 10. 29. 08:25
반응형

Xcode 8 : 함수 유형은 내 빌드를 깨는 인수를 생산할 수 없습니다.


어떤 방송에서 Swift는 사용자가 완료할지 선택한 변수 레이블을 제거하도록 강요하여 코딩의 가독성을 낮추기로 선택합니다. 나는 스위프트 토론을 읽더라도 여전히 실수라고 생각합니다. 그것을 그것을 선택적으로 만들 수 있습니다.

Xcode 8 사용하여 빌드 할 때-컴파일러가 Swift 2.3을 사용하는 방법을 강제하는 방법이 있습니까? 그래서 더 이상 버그 발생 오류가 발생하지 않았습니까? 레거시 Swift (빌드 설정 아래)를 사용하는 옵션을 업데이트했지만 여전히이 오류가 발생하는 것입니다.xcode의 레거시 지원

함수 유형은 'isloggedIn'인수 레이블을 수 없습니다. 대신 '_'사용

오류 Xcode 8

완성 된 가용성에서 레이블을 어떻게 사용할 수 있습니까?


Swift 디자이너는 함수 유형에 대한 인수 레이블을 금지하기로 결정했습니다.

그 이유는 여기에 설명되어 있습니다 : https://github.com/apple/swift-evolution/blob/master/proposals/0111-remove-arg-label-type-significance.md

인수 레이블을 금지하면 클로저를 잘못 호출하는 것이 훨씬 중단되고 언어의 유형 시스템을 단순화하는 것보다 더 중요해 보이기 때문에 실망스럽고 의심스러운 선택입니다.

사용성> 이데올로기.


적절한 할 해결 방법입니다. 할 수없는 일 :

func doStuff(completion: (foo: Int, bar: String) -> Void) {
    ...
    completion(foo: 0, bar: "")
}

...하지만 다음과 같이 할 수 있습니다.

func doStuff(completion: ((foo: Int, bar: String)) -> Void) {
    ...
    completion((foo: 0, bar: ""))
}

즉,이 경우에는 튜플 인 클로저에 이름이 지정되지 않은 단일 인수가 있습니다 (foo: Int, bar: String).

그 자체로드 추악하지만 인수 레이블은 유지합니다.

면책 조항 :이 접근 방식의 또는 성능 영향에 대해 생각하지 않습니다.


위의 정보에 따르면 문제를 실제로 해결하고 수행자가 다음과 같이 인수 레이블을 선택 사항으로 만들기위한 제안을 제기하는 것입니다.

  1. 개발 속도를 향상시킬 수 있습니다.
  2. 오류 결함 : (오류 부울 값을 예상하는 항목과 잘못된 처리기 항목으로 인해 여러 오류가 발생했습니다)
  3. 팀 구성원이 코드를 더 쉽게 읽을 수 있습니다. 모든 사람이 팀원이 한 명 뿐인 것은 아니 다른 사람의 코드를 쉽게 선택할 수 있습니다.
  4. 마지막으로 좋은 프로그래밍 관행은 솔루션이 개발중인 실제 항목과 비슷해야한다는 것을 의미합니다. completionhandler: (newvalues, nil)관리되는 항목보다 덜 우울.completionhandler(results: newValue, error:nil)

나는 읽는 사람들이 신청하기 전에 이것에 대한 보도 기사를 제출하기 전에 지원하는 다른 사람들이 있음을 보여줄 수 있기를 바랍니다.

편집 : 여기에 피치를 제출했습니다 : https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20161010/028083.html 동의 한 것으로 보입니다. 그것이 일어날 것 같지만 토론은 그것이 가능한 것이 높음)


_를 사용하여 고유 한 변수의 이름을 지정하지 않는다. 각 변수에 _를 붙인 다음 맹목적으로 함수를 호출하는 대신 래퍼를 만드는 것이 좋습니다.

함수 유형에 대한 명명 된 변수를 잃으면 잘못된 값으로 함수를 호출 할 위험이 더 커지하고 함수에 대한 유일한 변수가있는 것이 좋습니다.

이렇게하면 지정되고 함수의 필드에 이름이 지정되고 함수에 값 유형은 한 가지뿐입니다. 더 복잡하지만 그렇게 할 수없는 것입니다. 최소한 이렇게하면 더 안전 해지고 덜 더러워 질 것입니다.

struct LineNoteCellState {

    var lineNoteText: String?
    var printOnInvoice = false
    var printOnLabel = false
}

다음은 사용되는 예입니다.

cell.configure(editCallback: { (_ state: LineNoteCellState) in

    self.lineNoteText = state.lineNoteText
    self.printOnInvoice = state.printOnInvoice
    self.printOnLabel = state.printOnLabel
})

반 해결 방법, _

completion: (_ success: Bool) -> Void

참고 URL : https://stackoverflow.com/questions/39613272/xcode-8-function-types-cannot-have-argument-label-breaking-my-build

반응형