質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

3回答

2335閲覧

Swiftの関数呼び出しの際の引数について

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/06/29 10:07

呼び出し方に違和感があります。
下記のコードのように、して呼び出す際に第一引数にラベルを指定しなくてもいいのはなぜですか?
また、第二引数にラベルを指定しなくてはならないのは、なぜでしょうか?

func greet(name: String, day: String) -> String {
return "Hello (name), today is (day)."
}
greet("Bob", day: "Tuesday")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
_Kentarou

総合スコア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

Mr_Roboto

総合スコア2208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Objective-c ではもともと、 funcWuthXxx というような名前に引数の説明がついているメソッドが多いのです。
それらのメソッドをそのままSwiftに移した結果、第一引数にラベルを付けると二重に説明することになって冗長になるためつけないことになっているのだと思います。

ですが一貫性がないとは思っていたようで、Swift3.0で関数ラベルのルールが変更になるようです。

投稿2016/06/29 10:46

u39ueda

総合スコア950

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問