Objective-CからSwiftに書き直そうとしています。構文を理解したり、ドキュメントを理解したりできません。
ここに私が書いたObjective-Cの簡単な例があります:
[UIView animateWithDuration:10.0 animations:^{self.navigationController.toolbar.frame = CGRectMake(0,10,0,10);}];
これをSwiftでどのように書くのですか?
これはオートコンプリートが与えるテンプレートです:
UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void))
予想される引数の型とアニメーション引数への戻りの型がわかっているため、コンパイラは問題なくそれらを推測できます。これは動作するはずです(現時点では、遊び場はありません:
_UIView.animateWithDuration(10.0, animations: {
self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
})
_
クロージャの詳細については、Swift docsの の章を参照してください
CGRect()
についての注記- 開発者用ドキュメント Swiftコードで使用されているCGRect()
を表示します。おそらくインポートが必要ですか?
コメントの更新:次のように末尾クロージャを使用することもできます:
_UIView.animateWithDuration(10.0) {
self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
}
_
これはSwiftクロージャの形式です:
{(parameter:type, parameter: type, ...) -> returntype in
//do stuff
}
これはあなたがすべきことです:
//The animation closure will take no parameters and return void (nothing).
UIView.animateWithDuration(duration: NSTimeInterval, animations: {() -> Void in
//Animate anything.
})
クロージャの documentation は次のとおりです。
次のコードは、独自のブロックを作成するためのガイドになります。
class func testFunc(completion: ((list : NSArray!) -> Void)?) {
//--- block code.
if completion! != nil {
completion! (list: NSArray())
}
}
あなたはそれを次のように呼ぶことができます-
className.testFunc {
(list: NSArray!) -> Void in
}
基本的には、3つの同じ方法で記述できます。
正しいことをクロージャー/コードブロックに記述します。
UIView.animateWithDuration(10.0) {
self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
}
これは末尾クロージャとも呼ばれます(クロージャパラメータがlastパラメータ)
これは、パラメーター 'animations'がもはや書き込まれないことを意味しません。書かれていますが、上記のフォーマットと同じです。
行内に正確に記述します。すべての括弧と中括弧を使用して記述するのは少しバグが多いため、ほとんどの開発者はそのようなことを避けます。
UIView.animateWithDuration(10.0, animations: {
self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
})
(名前、つまり「アニメーション」を記述した末尾のクロージャーとは対照的に)これはインラインクロージャーとして知られています
よりモジュール化された感覚で書く
UIView.animateWithDuration(duration: NSTimeInterval, animations: animatingFunc)
func animatingFunc() {
self.navigationController.toolbar.frame = CGRect(x:0.0, y:10.0, width:10.0, height:0.0)
}
パラメータ「アニメーション」のタイプは() -> Void
まさに私たちがやっていることと同じように、animationatingFuncはパラメーターを取りません(つまり '()'で、何も返しません(つまり 'void')
(Swiftでは、関数は型であり、パラメーターとして渡すことができます)これはより読みやすいと言う人もいれば、末尾のクロージャーが...
サイドノート1何もすることもできません(これは実際には意味がありませんが、他の多くのハンドラー/アニメーション/完了ハンドラーでは何もしたくない場合があります)。
UIView.animateWithDuration(duration: NSTimeInterval, animations: nil)
サイドノート2
値をcaptureする必要がある場合、クロージャはより興味深いものになります。 this の簡単なデモを参照してください。 Swiftクロージャの詳細については、 Appleのドキュメント)を参照してください
Swiftでクロージャを宣言するにはどうすればよいですか?
変数として:
var closureName: (ParameterTypes) -> ReturnType
オプションの変数として:
var closureName: ((ParameterTypes) -> ReturnType)?
タイプエイリアスとして:
typealias ClosureType = (ParameterTypes) -> ReturnType
定数として:
_let closureName: ClosureType = { ... }
_
別の関数へのパラメーターとして:
funcName(parameter: (ParameterTypes) -> ReturnType)
注:渡されたクロージャがメソッドのスコープよりも長く存続する場合、たとえばプロパティに保存する場合は、_@escaping
_で注釈を付ける必要があります。
関数呼び出しの引数として:
funcName({ (ParameterTypes) -> ReturnType in statements })
関数パラメーターとして:
array.sorted(by: { (item1: Int, item2: Int) -> Bool in return item1 < item2 })
暗黙の型を持つ関数パラメーターとして:
array.sorted(by: { (item1, item2) -> Bool in return item1 < item2 })
暗黙の戻り値の型を持つ関数パラメーターとして:
array.sorted(by: { (item1, item2) in return item1 < item2 })
最後の関数パラメーターとして:
array.sorted { (item1, item2) in return item1 < item2 }
最後のパラメーターとして、省略引数名を使用します。
_array.sorted { return $0 < $1 }
_
暗黙の戻り値を持つ最後のパラメーターとして:
_array.sorted { $0 < $1 }
_
最後のパラメーターとして、既存の関数への参照として:
array.sorted(by: <)
明示的なキャプチャセマンティクスを持つ関数パラメーターとして:
array.sorted(by: { [unowned self] (item1: Int, item2: Int) -> Bool in return item1 < item2 })
明示的なキャプチャセマンティクスと推論されたパラメーター/戻り値の型を持つ関数パラメーターとして:
array.sorted(by: { [unowned self] in return $0 < $1 })
このサイトは、クロージャーのすべての可能な使用法の完全なリストであることを意図していません。
ref: http://goshdarnclosuresyntax.com/