何らかの理由でSwiftは、ユーザーに完了ハンドラーのパラメーターラベルを削除するように強制することで、コーディングを読みにくくすることを選択したようです。私はSwiftの議論を読みましたが、それでも間違いだと思います。少なくとも彼らはそれをオプションにしたかもしれません。
Xcode 8を使用してビルドする場合、コンパイラーにSwift 2.3を使用するように強制する方法はありますか。これらのエラーはもう発生しませんか?レガシーSwift(ビルド設定の下)を使用するオプションを更新しました しかし、私はまだこのエラーを受け取っているようです:
関数タイプに引数ラベル「isloggedIn」を含めることはできません。代わりに「_」を使用してください
完了ハンドラーでラベルを保持するにはどうすればよいですか?
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)
を持っています。
それ自体はいですが、少なくとも引数のラベルは保持します。
免責事項:このアプローチのキャプチャまたはパフォーマンスへの影響については考えていません。
上記の情報に基づいて-これを実際に修正し、そのパフォーマンスを確保する唯一の方法は、次の目的で引数ラベルをオプションにするという提案を上げることであるように見えます:
completionhandler: (newvalues, nil)
は、completionhandler(results: newValue, error:nil)
より管理対象のアイテムのように見えません私はこれを読んでいる人々が私がそれを提出する前にこれに関する彼らのフィードバック/コメントを共有することを望みます。
編集:私はここにピッチを提出しました: https://lists.Swift.org/pipermail/Swift-evolution/Week-of-Mon-20161010/028083.html 同意されたようですそれが起こるように見えますが、議論はこれがSwift 4の改善として提出されるかどうかです(非常に可能性が高い)
_を使用してパラメーターに名前を付けないようにする必要がありますが、それは残念です。各パラメーターに_を付けて、関数を盲目的に呼び出す代わりに、ラッパーオブジェクトを作成することをお勧めします。
関数型の名前付きパラメーターを失うと、間違った値で関数を呼び出すリスクが増えるため、構造体でパラメーターをラップし、それを関数の唯一のパラメーターにすることをお勧めします。
これにより、構造体のフィールドに名前が付けられ、関数に渡す値のタイプは1つだけになります。関数のパラメーターに名前を付けることができた場合よりも面倒ですが、できません。少なくともこの方法では、より安全になり、汚れが少なくなります。
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