匿名クロージャー引数の使用法を理解する上で問題があります。私が遊び場にこの不自然な例を手早く説明するために:匿名クロージャー引数のサブセットのみにアクセスする
typealias SomeClosureType = (
thing0: Float,
thing1: Float,
thing2: Float,
thing3: Float,
thing4: Float,
thing5: Float
) -> Void
class MyClass {
var someClosure: SomeClosureType!
init() {
// This is OK but long
self.someClosure = { (thing0: Float, thing1: Float, thing2: Float, thing3: Float, thing4: Float, thing5: Float) in self.handleThing0(thing0) }
// Compiler error: "cannot assign value of type '(Float) ->()' to type 'SomeClosureType!'"
self.someClosure = { self.handleThing0($0) }
}
func handleThing0(thing0: Float) {
print("\(thing0)")
}
}
let myInstance = MyClass()
myInstance.someClosure(thing0: 0, thing1: 1, thing2: 2, thing3: 3, thing4: 4, thing5: 5)
をだから、基本的に私は、クロージャ内からの匿名の閉鎖の引数にアクセスしようとすると、私はこのエラーを取得します。私は何が欠けていますか?
ありがとう、ダニエル。あなたは問題をよく説明したと思います。私は、コンパイラーがクロージャー引数のサブセットのみを参照できるように十分にスマートであることを望みます。私はこれが設計上のものか何らかの技術的な限界かと思います。 –
@JohnScaloええ、私は完全に参照するパラメータのサブセットのみを許可するケースを見ることができます。一方、1)コンパイラは間違って何か重要なことを処理していないと想定しなければならず、コンパイラが間違いの可能性があるとフラグを立てるほうが良いということを意味します2)Swiftは非常に強い型や契約に向いています。したがって、開発者がパラメータ "A"とパラメータ "B"を扱うはずのクロージャを指定し、 "A"だけを扱うクロージャを指定する場合、それはSwiftの性質とかなり矛盾しているとみなすことができます。 –
@DanielHall、行動は容認できますが、それはSwiftチームのバグとみなされます。 – zneak