Di bagian referensi dokumen Apple ada banyak hal seperti ini:
func runAction(_
action
: SKAction!)
'Setara' Objective-C dari ini adalah:
- (void)runAction:(SKAction *)
action
Itu mengejutkan saya bahwa mungkin penting bahwa (dalam referensi Swift) ada ruang setelah garis bawah dan "tindakan" ditulis dalam huruf miring.
Tetapi saya tidak tahu apa yang ingin disampaikannya. Jadi mungkin pertanyaannya adalah ... adakah referensi untuk konvensi yang digunakan dalam referensi?
- inilah halaman yang saya maksudkan dalam referensi ini untuk penggunaan garis bawah: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction
Memperbarui
Swift 3 telah membuat beberapa perubahan pada bagaimana nama parameter fungsi / metode dan label argumen digunakan dan dinamai. Ini memiliki konsekuensi pada pertanyaan ini dan jawabannya. @Rickster melakukan pekerjaan luar biasa untuk menjawab pertanyaan yang berbeda tentang _underscores dalam fungsi yang membersihkan sebagian besar dari ini, di sini: Mengapa saya perlu menggarisbawahi dengan cepat?
sumber
Jawaban:
Kedua jawaban itu benar tetapi saya ingin menjelaskan sedikit lebih banyak.
_
digunakan untuk memodifikasi perilaku nama parameter eksternal untuk metode .Di bagian Parameter Nama Lokal dan Eksternal untuk Metode dokumentasi, dikatakan:
Di sisi lain, fungsi secara default tidak memiliki nama parameter eksternal.
Sebagai contoh, kita memiliki
foo()
metode ini didefinisikan di kelasBar
:Ketika Anda menelepon
foo()
, ini disebut sepertibar.foo("Hello", s2: "World")
.Tapi , Anda bisa mengesampingkan perilaku ini dengan menggunakan
_
di depans2
tempat itu dinyatakan.Kemudian, ketika Anda menelepon
foo
, itu bisa disebut sepertibar.foo("Hello", "World")
tanpa nama parameter kedua.Kembali ke kasus Anda,
runAction
adalah metode karena itu terkait dengan tipeSKNode
, jelas. Dengan demikian, menempatkan_
parameter sebelumaction
memungkinkan Anda untuk memanggilrunAction
tanpa nama eksternal.Pembaruan untuk Swift 2.0
Fungsi dan metode sekarang bekerja dengan cara yang sama dalam hal deklarasi nama argumen lokal dan eksternal.
Fungsi sekarang dipanggil dengan menggunakan nama parameter eksternal secara default, mulai dari parameter ke-2. Aturan ini hanya berlaku untuk kode Swift murni.
Jadi, dengan memberikan
_
di depan fungsi , pemanggil tidak harus menentukan nama parameter eksternal, seperti apa yang akan Anda lakukan untuk suatu metode .sumber
_
menulis sebelum parameter kedua, jawaban Anda cukup jelas; bagaimana jika dalamfunc runAction(_action: SKAction!)
,_
sebelum parameter pertama atau jika Anda menulis kode berikutfunc foo(_ s1: String) { // your code }
Xcode akan memberi Anda peringatan, tetapi ada banyak kode sepertifunc bringSubviewToFront(_ view: UIView)
dalam referensi, mengapa?_
untuk parameter pertama tidak relevan. Saya dapat membuat asumsi, bahwa para desainer berpikir itu jelas cukup untuk kode Anda dan tidak meningkatkan keterbacaan, sebaliknya, itu mengotori kode. Jadi, Anda mendapatkan peringatan itu. Referensi memiliki tujuan yang berlawanan: harus sejelas mungkin - sehingga garis bawah parameter pertama disebutkan untuk setiap metode. Itu akan menjelaskan semuanya)-
sebelum parameter pertama tidak lagi asing. Misalnya:override func viewWillAppear(_ animated: Bool)
memberi sinyal bahwa penelepon (kode Objective-C) tidak akan menggunakan label parameterGaris bawah adalah token umum yang digunakan untuk menunjukkan nilai yang dibuang.
Dalam kasus khusus ini, itu berarti bahwa fungsi akan dipanggil sebagai
runAction(argument)
gantirunAction(action:argument)
Dalam konteks lain ia memiliki makna serupa lainnya, misalnya dalam:
Itu berarti bahwa kami hanya ingin mengeksekusi blok 5 kali dan kami tidak peduli dengan indeks di dalam blok.
Dalam konteks ini:
Itu berarti bahwa kita tidak peduli apa elemen kedua dari tuple, hanya yang pertama.
sumber
let pi = 3.141_592_653_59
let pi = 3.1_4_15_92___63
Karena Swift 3 semua label argumen diperlukan secara default .
Anda dapat memaksa IDE untuk menyembunyikan label argumen
_
.menelepon
foo(a: "abc")
danfoo2("abc")
Mengapa Apple menggunakannya?
Anda dapat melihat Apple menggunakannya di seluruh API. Pustaka Apple masih ditulis dalam Objective-C (jika tidak, mereka tetap memiliki nama fungsi yang sama, yang dirancang untuk sintaks Objective-C)
Fungsi seperti
applicationWillResignActive(_ application: UIApplication)
akan berlebihan nama parameterapplication
, karena sudah ada yang aplikasi di dalamnya nama fungsi.Contoh anda
func runAction(_ action: SKAction!)
akan disebut tanpa itu_
tanda sepertirunAction(action:)
. Nama parameteraction
akan berlebihan karena sudah ada satu di nama fungsi. Itulah tujuannya dan mengapa itu ada di sana.sumber
Pengidentifikasi di depan deklarasi parameter mendefinisikan nama parameter eksternal . Ini adalah nama yang harus disediakan oleh pemanggil saat memanggil fungsi:
Swift memberikan nama eksternal otomatis untuk parameter default apa pun yang Anda tetapkan, jika Anda sendiri tidak memberikan nama eksternal. Menggunakan garis bawah untuk nama parameter eksternal menyisih dari perilaku ini:
Anda dapat membaca lebih lanjut tentang perilaku ini di bagian Nama Eksternal untuk Parameter dengan Nilai Default di sini .
sumber
SK
desainer tidak ingin Anda menulisaction
dua kali, karena "action" sudah menjadi bagian dari nama fungsi. Dengan kata lain, mereka tidak ingin Anda menulissprite.runAction(action:moveGroundSpritesForever)
. Tujuan dari nama parameter eksternal adalah untuk membuat kode Anda "dibaca seperti kalimat"; menggunakanaction
dua kali akan mengalahkan tujuan itu.foo.bar(param: 'fiddle')
danfoo.bar('fiddle')
CATATAN: dengan hanya satu argumen itu benar-benar tidak menjadi jelas ... tetapi dengan beberapa argumen itu menjadi sangat relevan:foo.bar(param1: 'fiddle', param2: 'dee')
vsfoo.bar('fiddle','dee')
Saya pikir ini memaksa konvensi di Swift yang membuatnya lebih dekat ke objektif-c, yang lebih cocok dengan konvensi kakao. Di objc Anda tidak (secara eksternal) memberi nama parameter pertama Anda. Sebagai gantinya, dengan konvensi Anda biasanya memasukkan nama eksternal di bagian akhir nama metode seperti ini:
Untuk membuat panggilan api Swift konsisten dengan objc Anda akan ingin menekan nama parameter eksternal param pertama.
sumber
Sebenarnya, ada perbedaan antara kode nyata yang digunakan untuk mendefinisikan metode dan deklarasi metode dalam dokumen Apple. Mari kita ambil UIControl 's - addTarget: action: forControlEvents: metode misalnya, kode sebenarnya adalah:
Namun dalam dokumen, ini tampak seperti ini (perhatikan _ sebelum target):
Dalam kode nyata, _ digunakan untuk membuat nama eksternal parameter kedua atau berikutnya tidak muncul ketika suatu metode dipanggil, sementara dalam dokumen, _ sebelum nama lokal parameter menunjukkan bahwa ketika Anda memanggil suatu metode atau fungsi, Anda tidak boleh memberikan nama eksternal.
Tidak ada nama eksternal ketika suatu fungsi dipanggil secara default kecuali Anda memberikan sendiri atau menambahkan # sebelum (tanpa spasi) nama lokal parameter, misalnya, ini adalah bagaimana kami menggunakan dispatch_after :
Dan dalam dokumen, tampak seperti ini (perhatikan tiga _):
Konvensi deklarasi fungsi sama seperti yang saya jelaskan untuk metode.
sumber
Hanya lebih secara visual.
Seperti yang Anda lihat,
_
hapus saja nama parameter lokal atau tidak.sumber