Ketika saya mengatur firstThing
ke default nil
ini akan berfungsi, tanpa nilai default nil
saya mendapatkan kesalahan bahwa ada parameter yang hilang saat memanggil fungsi.
Dengan mengetik Int?
saya pikir itu menjadikannya opsional dengan nilai default nil
, apakah saya benar? Dan jika demikian, mengapa tidak berhasil tanpa = nil
?
func test(firstThing: Int? = nil) {
if firstThing != nil {
print(firstThing!)
}
print("done")
}
test()
func test(firstThing: Int = 4)
: non-Optional
parameter dengan nilai default. TheOptional
jenis (yang adalah apa?
dalam jenis nama mengembang ke) adalah jenis nilai; "parameter opsional" adalah nama yang tidak menguntungkan untuk parameter yang mungkin ada atau tidak ada pada panggilan fungsi, apa pun tipenya.Jawaban:
Opsional dan parameter default adalah dua hal yang berbeda.
Opsional adalah variabel yang bisa
nil
, itu saja.Parameter default menggunakan nilai default ketika Anda menghilangkan parameter itu, nilai default ini ditentukan seperti ini:
func test(param: Int = 0)
Jika Anda menentukan parameter yang opsional, Anda harus menyediakannya, meskipun nilai yang ingin Anda teruskan adalah
nil
. Jika fungsi Anda terlihat seperti inifunc test(param: Int?)
, Anda tidak dapat menyebutnya seperti initest()
. Meskipun parameternya opsional, ia tidak memiliki nilai default.Anda juga dapat menggabungkan dua dan memiliki parameter yang mengambil opsional mana
nil
adalah nilai default, seperti ini:func test(param: Int? = nil)
.sumber
Argumen default memungkinkan Anda memanggil fungsi tanpa memberikan argumen. Jika Anda tidak meneruskan argumen, maka argumen default akan disediakan. Jadi menggunakan kode Anda, ini ...
... persis sama dengan ini:
Jika Anda membiarkan argumen default seperti ini ...
... maka Anda tidak dapat lagi melakukan ini ...
Jika Anda melakukannya, Anda akan mendapatkan kesalahan "argumen yang hilang" yang Anda jelaskan. Anda harus menyampaikan argumen setiap saat, meskipun argumen itu hanya
nil
:sumber
Swift tidak seperti bahasa seperti JavaScript, di mana Anda dapat memanggil suatu fungsi tanpa melewatkan parameter dan itu akan tetap dipanggil. Jadi untuk memanggil fungsi di Swift, Anda perlu menetapkan nilai ke parameternya.
Nilai default untuk parameter memungkinkan Anda untuk menetapkan nilai tanpa menentukannya saat memanggil fungsi. Itulah mengapa
test()
berfungsi ketika Anda menentukan nilai default pada deklarasi test.Jika Anda tidak menyertakan bahwa nilai default, Anda perlu memberikan nilai pada panggilan:
test(nil)
.Selain itu, dan tidak terkait langsung dengan pertanyaan ini, tetapi mungkin perlu diperhatikan, Anda menggunakan cara "C ++" untuk menangani kemungkinan pointer nol, untuk menangani kemungkinan opsional nil di Swift. Kode berikut lebih aman (khususnya dalam perangkat lunak multithreading), dan memungkinkan Anda menghindari pembongkaran paksa opsional:
sumber
Anda menggabungkan
Optional
dengan memiliki default. AnOptional
menerima nilai atau nihil. Memiliki default memungkinkan argumen dihilangkan dalam memanggil fungsi. Argumen dapat memiliki nilai default dengan atau tanpaOptional
tipe.Contoh panggilan dengan keluaran:
Untuk meringkas:
Optional
mungkin nil atau mungkin berisi turunan dari TypeOptional
dan memiliki default, maka itu dapat dihilangkan dari pemanggilan fungsi ATAU dapat dimasukkan dan dapat diberikan dengan nilai nil (misalnya param1: nil)sumber
func getFilterNames(name: inout String){ }
yang memungkinkan Anda mengubah nama yang diberikan.jika Anda perlu menggunakan parameter bool, Anda hanya perlu menetapkan nilai default.
maka Anda dapat menggunakan tanpa atau dengan param:
sumber
"Parameter opsional" berarti "jenis parameter ini opsional". Ini tidak berarti "Parameter ini opsional dan, oleh karena itu, dapat diabaikan saat Anda memanggil fungsi".
Istilah "parameter opsional" tampaknya membingungkan. Untuk memperjelas, lebih akurat mengatakan "parameter jenis opsional" daripada "parameter opsional" karena kata "opsional" di sini hanya dimaksudkan untuk menjelaskan jenis nilai parameter dan tidak ada yang lain.
sumber
Jika Anda ingin dapat memanggil
func
dengan atau tanpa parameter, Anda dapat membuat yang keduafunc
dari nama yang sama yang memanggil yang lain.sekarang Anda dapat memanggil fungsi bernama
test
tanpa atau tanpa parameter.sumber
Ini sedikit rumit ketika Anda mencoba menggabungkan parameter opsional dan nilai default untuk parameter itu. Seperti ini,
Keduanya adalah ide yang sangat berlawanan. Jika Anda memiliki parameter tipe opsional tetapi Anda juga memberikan nilai default padanya, sekarang ini bukan lagi tipe opsional karena memiliki nilai default. Meskipun defaultnya nihil, swift hanya menghapus pengikatan opsional tanpa memeriksa nilai defaultnya.
Jadi selalu lebih baik untuk tidak menggunakan nil sebagai nilai default.
sumber
nil
).var foo: String; print(foo)
). Tapi argumen fungsi dengan nilai default adalah argumen opsional (Anda tidak harus meneruskannya dalam pemanggilan fungsi) dan bisa juga dalam tipe Opsional (memungkinkannil
untuk ditetapkan padanya, bahkan sebagai nilai default).Nilai default tidak berarti nilai default dari tipe data. Di sini nilai default berarti nilai yang ditentukan pada saat mendefinisikan fungsi. kita harus mendeklarasikan nilai default variabel saat mendefinisikan variabel dalam fungsi.
sumber