呼び出し方に違和感があります。
下記のコードのように、して呼び出す際に第一引数にラベルを指定しなくてもいいのはなぜですか?
また、第二引数にラベルを指定しなくてはならないのは、なぜでしょうか?
func greet(name: String, day: String) -> String {
return "Hello (name), today is (day)."
}
greet("Bob", day: "Tuesday")
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
下記のコードのように、して呼び出す際に第一引数にラベルを指定しなくてもいいのはなぜですか?
まさにここの仕様がSwift3.0で変更になります。
[iOS][Swift] Swift 3.0の変更点まとめ
Better Translation of Objective-C APIs Into Swift
第一引数もラベルを付けるように修正されます、合わせてメソッド名に第一引数のラベルを含めないようにする修正も入ります。
Swift2.x
swift
1class UIBezierPath : NSObject, NSCopying, NSCoding { 2 convenience init(ovalInRect: CGRect) 3 func moveToPoint(_: CGPoint) 4 func addLineToPoint(_: CGPoint) 5 func addCurveToPoint(_: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint) 6 func addQuadCurveToPoint(_: CGPoint, controlPoint: CGPoint) 7 func appendPath(_: UIBezierPath) 8 func bezierPathByReversingPath() -> UIBezierPath 9 func applyTransform(_: CGAffineTransform) 10 var empty: Bool { get } 11 func containsPoint(_: CGPoint) -> Bool 12 func fillWithBlendMode(_: CGBlendMode, alpha: CGFloat) 13 func strokeWithBlendMode(_: CGBlendMode, alpha: CGFloat) 14 func copyWithZone(_: NSZone) -> AnyObject 15 func encodeWithCoder(_: NSCoder) 16}
Swift3.0
swift
1class UIBezierPath : NSObject, NSCopying, NSCoding { 2 convenience init(ovalIn rect: CGRect) 3 func move(to point: CGPoint) 4 func addLine(to point: CGPoint) 5 func addCurve(to endPoint: CGPoint, controlPoint1 controlPoint1: CGPoint, controlPoint2 controlPoint2: CGPoint) 6 func addQuadCurve(to endPoint: CGPoint, controlPoint controlPoint: CGPoint) 7 func append(_ bezierPath: UIBezierPath) 8 func reversing() -> UIBezierPath 9 func apply(_ transform: CGAffineTransform) 10 var isEmpty: Bool { get } 11 func contains(_ point: CGPoint) -> Bool 12 func fill(_ blendMode: CGBlendMode, alpha alpha: CGFloat) 13 func stroke(_ blendMode: CGBlendMode, alpha alpha: CGFloat) 14 func copy(with zone: NSZone = nil) -> AnyObject 15 func encode(with aCoder: NSCoder) 16}
第二引数にラベルを指定しなくてはならないのは、なぜでしょうか?
今まではメソッド名に第一引数のラベルが含まれていたので、全ての引数にラベルが付いている感じではありました。
以下のように書くと第二引数のラベルも削除できますが、可読性等を考慮する必要があると思います。
swift
1func greet(name: String, _ day: String) -> String { 2 return "Hello \(name), today is \(day)." 3} 4greet("Bob", "Tuesday")
投稿2016/06/29 11:04
編集2016/06/29 14:40総合スコア8490
0
これは、こういう言語仕様だと言ってしまえば、それまでなのですが、Objective-Cの頃からですね。
Swiftは、まだきちんと勉強していないのですが、Objective−Cの頃に学んだ知識で説明すると
1番目の引数は、メソッド名によって意味が分かるから、2番目以降は意味がわかりやすくするため
みたいなことだったと思います。
最初、私は名前付き引数だと思ったのですが、順番は入れ替えられないのでそうではないらしいです。
メソッド名も長くて記述も冗長でなんとなくとっつきにくいなーと思ったのですが、
ドキュメントを書かなくてもソースを見れば、分かるようにという工夫だそうです。
例えばが分かりやすくなるかどうか分かりませんが、
私は、よくStringの文字の切り出しをする時に2番めの引数が、終了位置だったか長さだったか分からなくなります。Javaならこんな感じです。
Java
1prpductCode.subString(2, 3);
2は、開始位置だろうけど、3って終了?長さ?・・・よく忘れます^_^;
なので、ラベルがついて更に日本語だったとしたらとして書いてみると
商品コード.切り出し(2, 長さ: 5)
こんな感じのイメージになると思います。
引数が多い場合やオーバーロードされているメソッドが増えてくると
この方が分かりやすいよねーってことだと思います。
投稿2016/06/29 11:02
総合スコア2208
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Objective-c ではもともと、 funcWuthXxx というような名前に引数の説明がついているメソッドが多いのです。
それらのメソッドをそのままSwiftに移した結果、第一引数にラベルを付けると二重に説明することになって冗長になるためつけないことになっているのだと思います。
ですが一貫性がないとは思っていたようで、Swift3.0で関数ラベルのルールが変更になるようです。
投稿2016/06/29 10:46
総合スコア950
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。