関数シグネチャ
Swift言語における関数シグネチャは、独特な書き方をします。
例えば、次の関数の場合、
func session(
_ session: MCSession,
didReceiveCertificate certificate: [Any]?,
fromPeer peerID: MCPeerID,
certificateHandler: @escaping (Bool) -> Void
)
関数シグネチャは、次のように書きます。
session(_:didReceiveCertificate:fromPeer:certificateHandler:)
- ドキュメントページに出てきます

- 関数シグネチャ が そのまんま ドキュメントページのURLにも使われています
https://developer.apple.com/documentation/multipeerconnectivity/mcsessiondelegate/session(_:didreceivecertificate:frompeer:certificatehandler:)
- Xcodeのエディタでも 関数シグネチャが見えます。
Apple が提供するライブラリのAPIは、ドキュメントページを見れば関数シグネチャ
を得られますが、独自に実装した関数の関数シグネチャ
は、当然、Appleのドキュメントページにはありません。
Xcodeでは見れるのですが、この文字列をコピーすることができません。
このままでは、独自に実装した関数の関数シグネチャ
は、手作業で書くしかありません。
関数シグネチャを得る
Swift言語を使って、独自関数の関数シグネチャ
を得る方法を調べましたが、見つけられませんでした。
独自クラス(class/struct)を、Mirror
でリフレクションすれば下位構造で得られるかと 次のコードで試しましたが、
struct Point {
let x: Int, y: Int
func sub(other: Point) -> Point {
let x = self.x - other.x
let y = self.y - other.y
return Point(x: x, y: y)
}
}
let p1 = Point(x: 10, y: 10)
let M = Mirror(reflecting: p1)
for child in M.children {
print(child)
}
//(label: Optional("x"), value: 10)
//(label: Optional("y"), value: 10)
変数(?)は得られますが、関数は何も得られませんでした。
手で書くしかない?
関数シグネチャ は 簡単に手で書けますが、機械的に得たいところです。
関数名(引数名を:でつなげる:)
と書く。
型に関する情報は一切無し。戻り値があっても、戻り値の型も書かない。
引数の型を書かない、戻り値の型も分からない ので、これが関数シグネチャ
かと思いますが、「関数名と引数名がすべてを物語る」Swift思想なのでしょうね。
もし、関数シグネチャ を 機械的に得られる方法をご存知の方がいらしたら ぜひ教えてください。
#function
2024.7.11追記
あ ありました。
何度も見ていたのですが、完全に忘れていました。
'#function'リテラルです。
class FunctionSignatureTest {
func aFunction() -> String {
return #function
}
func aFunction(parameter: Int) -> String {
return #function
}
func aFunction(_ parameter: Int) -> String {
return #function
}
func aFunction(_ parameter: Int, _ anotherParameter: Int) -> String {
return #function
}
}
let functionSignatureTest = FunctionSignatureTest()
print(functionSignatureTest.aFunction())
print(functionSignatureTest.aFunction(parameter: 1))
print(functionSignatureTest.aFunction(1))
print(functionSignatureTest.aFunction(1, 2))
//aFunction()
//aFunction(parameter:)
//aFunction(_:)
//aFunction(_:_:)
実行しないと、関数シグネチャ
を得られませんが、実行コードを書くだけです。