0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

関数シグネチャ

Swift言語における関数シグネチャは、独特な書き方をします。

例えば、次の関数の場合、

func session(
    _ session: MCSession,
    didReceiveCertificate certificate: [Any]?,
    fromPeer peerID: MCPeerID,
    certificateHandler: @escaping (Bool) -> Void
)

関数シグネチャは、次のように書きます。

session(_:didReceiveCertificate:fromPeer:certificateHandler:)
  • ドキュメントページに出てきます
man.png
  • Xcodeのエディタでも 関数シグネチャが見えます。

xcode.png

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(_:_:)

実行しないと、関数シグネチャを得られませんが、実行コードを書くだけです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?