Swift part13at TECH
Swift part13 - 暇つぶし2ch394:デフォルトの名無しさん
25/05/26 12:10:01.23 E/O4cAvn0.net
なんか荒れててワロタ
Gptが万能だと思ってる底辺って、結構いるんだな
じゃあ、このスレは不要だから削除申請しといてあげたよW

Gptに感謝W

395:デフォルトの名無しさん
25/05/26 12:24:31.90 mCNwP+3w0.net
こいつこれで自演バレてないと思ってるとかどういう頭してるんだよw
マジで頭悪すぎだろwww

396:デフォルトの名無しさん
25/06/10 10:38:10.27 J5CIMo790.net
test

397:デフォルトの名無しさん
25/06/10 10:51:04.60 co9N3dhx0.net
func test_func(function: () -> Void) -> String {
let test: String = "引数のfunction名"
return(test)
}

func test_func1() -> Void {
return()
}

func test_func2() -> Void {
return()
}

print(test_func(function: test_func1())) //test_func1 出力
print(test_func(function: test_func2())) //test_func2 出力

--
関数の引数に関数を指定した場合、引数の関数名を取得する方法ってありますか?

398:デフォルトの名無しさん
25/06/10 14:52:10.11 CdIKdoXB0.net
>>397
#functionでできる範囲内で工夫したら?

@objc属性をつけられるならリフレクションでどうにかできると思うけど面倒くさい

あとはマクロを使って#call_test_func(function: test_func1)を
test_func(function: test_func1, name: “test_func1”)に展開するとかかな

399:デフォルトの名無しさん
25/06/10 21:15:44.74 co9N3dhx0.net
private test_func_name: String!
func test_func(function: () -> Void) -> String {
function()
let test: String = test_func_name
return(test)
}

func test_func1() -> Void {
test_func_name = #function
return()
}

func test_func2() -> Void {
test_func_name = #function
return()
}

print(test_func(function: test_func1())) //test_func1 出力
print(test_func(function: test_func2())) //test_func2 出力

--
>>398
> test_func(function: test_func1, name: “test_func1”)
これって、スペルミスしやすいですよね

上記の方が、まだマシな気はします

根本的に
関数の引数に関数を指定した場合、引数の関数名を取得
は不可ってことでしょうか

400:デフォルトの名無しさん
25/06/10 21:35:35.99 kcNgEpD90.net
URLリンク(stackoverflow.com)
これの回答?

401:デフォルトの名無しさん
25/06/10 22:03:32.75 co9N3dhx0.net
>>400
いいえ 違います

402:デフォルトの名無しさん
25/06/10 22:15:58.52 povNpgQm0.net
>Swift is a statically dispatched programming language.
>This results in Swift using memory addresses as much as possible when it needs to call a function.
>The side effect is the inability to capture the called function name, since in most of the cases it will be a simple memory address.

403:デフォルトの名無しさん
25/06/10 22:48:21.96 co9N3dhx0.net
>>402
ありがとう
ディクショナリー化して逃げることにします

404:デフォルトの名無しさん
25/06/10 23:17:17.93 HzGLhqs50.net
>>399
>これって、スペルミスしやすいですよね
だからマクロ・・・・・

>>402
@objc属性つければ事情が変わる

405:デフォルトの名無しさん
25/06/11 01:29:20.37 Y6NiPAiA0.net
テスト

406:デフォルトの名無しさん
25/06/11 08:54:28.08 Y6NiPAiA0.net
>>404
マクロにしても...

すいませんが、サンプルコーディングみせてもらえませんか
お願いします

407:デフォルトの名無しさん
25/06/11 23:22:15.31 Y6NiPAiA0.net
関数の引数に関数を指定した場合、引数の関数名取得して適宜分岐処理したかっただけでしたが、実質無理っぽいですね
いろいろと検索してたらObjectIdentifierなるものがあって、試したところ
引数の関数名は取得できないまでも、引数の関数の識別ができたので、解決しました

408:デフォルトの名無しさん
25/06/11 23:36:45.91 xQ0zj3960.net
>>406
主なところだけ書くけど
let firstArg = node.arguments.first!
let expr = firstArg.expression.trimmedDescription
return "test_func(function: \(expr), name: \"\(expr)\")"
みたいなので
#call_test_func(function: test_func1)みたいな呼び出しを
test_func(function: test_func1, name: "test_func1”)に展開できる

409:デフォルトの名無しさん
25/06/11 23:44:57.69 xQ0zj3960.net
>>407
高階関数で受け取った関数を識別して分岐処理を書くのは一般的には筋が悪い実装だよ
理解した上であえてやってるならいいけどそうじゃないなら再考を勧める

410:デフォルトの名無しさん
25/06/12 00:07:03.79 gPSDSI/z0.net
>>408
test_func(function: test_func1, name: "test_func1”)

test_func1 と "test_func1" として実装するのが気に入らないのです

>>409
そもそも引数に関数ってのが、好ましくないのは承知してます
ただ、どうしても引数とした関数として処理した方が、プログラム上、高メリットとなるので実装してます

余談ながら@objc化して引数の関数名を取得は可能でしたが、Selectorとかなんやらでなんか面倒で...
ObjectIdentifier使った方が、意外にスマートな分岐処理が実装できたので、ObjectIdentifierで処理します

411:デフォルトの名無しさん
25/06/12 01:05:32.00 huei3sVu0.net
>>410
>そもそも引数に関数ってのが、好ましくないのは承知してます
関数を受け渡しするのは別に悪くない
使う状況によってはむしろ好ましいことも多い
悪いのは関数を受け渡しする形にしているにもかかわらず
受け取った側でどの関数が渡されたかを識別して分岐しようとすること

@objcのは最初に書いてあるように一番面倒なやり方だからね
リフレクションを使いまくるような用途じゃなければ割に合わない

412:デフォルトの名無しさん
25/06/12 12:08:03.22 1TmeXXfD0.net
ありえん設計だな
何か根本的に勘違いしてるとしか考えられん

413:デフォルトの名無しさん
25/10/27 13:46:24.84 94yXD1ih0.net
Apple発のプログラミング言語「Swift」でAndroidアプリの開発が可能に
URLリンク(gigazine.net)

414:デフォルトの名無しさん
25/10/29 08:44:36.17 /33m2d4b0.net
なんかもう言語とかフレームワークとかなんでも良くなってきてる感
どうせAIが書くし


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch