Saya mencoba dengan baris kode ini
class Student {
var name: String
var age: Int?
init(name: String) {
self.name = name
}
func description() -> String {
return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
}
}
var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())
Hasil kode di atas adalah sebagai berikut
Daniel hides his age.
Daniel is Optional(18) years old.
Pertanyaan saya adalah mengapa ada Opsional (18) di sana, bagaimana saya bisa menghapus pilihan dan hanya mencetak
Daniel is 18 years old.
if let age = age { return ""} else { return "" }
Many Swift beginners think var age: Int? means that age is an Int which may or may not have a value. But it means that age is an Optional which may or may not hold an Int.
Sarana opsional bahwa Swift tidak sepenuhnya yakin apakah nilainya sesuai dengan tipe: misalnya, Int? artinya Swift tidak sepenuhnya yakin apakah bilangan tersebut adalah Int.
1) Jika Anda benar-benar yakin dengan jenisnya, Anda dapat menggunakan tanda seru untuk membukanya secara paksa, seperti ini:
Jika Anda benar-benar membuka paksa sebuah opsional dan itu sama dengan nihil, Anda mungkin mengalami kesalahan crash ini:
Ini belum tentu aman, jadi berikut adalah metode yang mungkin mencegah error jika Anda tidak yakin dengan jenis dan nilainya:
2) Opsional yang Tidak Dibungkus Secara Implisit
3) Pernyataan penjaga
Dari sini, Anda dapat melanjutkan dan menggunakan variabel yang tidak dibungkus. Pastikan hanya untuk membuka paksa (dengan!), Jika Anda yakin dengan jenis variabelnya.
sumber
Untuk tujuan pengujian / debugging, saya sering ingin mengeluarkan opsional sebagai string tanpa harus selalu menguji
nil
nilai, jadi saya membuat operator kustom.Saya meningkatkan banyak hal lebih jauh setelah membaca jawaban ini di pertanyaan lain .
Tentunya operator (dan atributnya) dapat disesuaikan dengan keinginan Anda, atau Anda dapat menjadikannya sebagai fungsi. Bagaimanapun, ini memungkinkan Anda untuk menulis kode sederhana seperti ini:
Mengintegrasikan ide protokol orang lain membuatnya jadi ini bahkan berfungsi dengan opsional bersarang, yang sering terjadi saat menggunakan rangkaian opsional. Sebagai contoh:
sumber
String
tempat lain (misalnya pesan log / kesalahan).Memperbarui
Cukup gunakan
me.age ?? "Unknown age!"
. Ia bekerja di 3.0.2.Jawaban Lama
Tanpa paksa membuka bungkus (tidak ada sinyal mach / crash jika nihil) cara lain yang bagus untuk melakukan ini adalah:
(result["ip"] ?? "unavailable").description
.result["ip"] ?? "unavailable"
seharusnya bekerja juga, tetapi tidak, setidaknya tidak di 2.2Tentu saja, ganti "tidak tersedia" dengan apa pun yang cocok untuk Anda: "nil", "tidak ditemukan" dll
sumber
Untuk membuka bungkus penggunaan opsional,
age!
bukanage
. Saat ini Anda sedang mencetak nilai opsional yang bisanil
. Itulah mengapa dibungkus denganOptional
.sumber
Dalam sekejap
Optional
adalah sesuatu yangnil
dalam beberapa kasus. Jika Anda 100% yakin bahwa avariable
akan selalu memiliki beberapa nilai dan tidak akan mengembalikannil
penambahan!
dengan variabel untuk membukanya secara paksa.Dalam kasus lain jika Anda tidak terlalu yakin dengan nilainya maka tambahkan
if let
blok atauguard
untuk memastikan bahwa nilai itu ada, jika tidak maka dapat mengakibatkan crash.Untuk
if let
blok:Untuk
guard
pernyataan:guard
adalah struktur bersyarat untuk mengembalikan kontrol jika kondisi tidak terpenuhi.Saya lebih suka menggunakan
guard
overif let
block dalam banyak situasi karena memungkinkan kita untuk mengembalikanfunction
jika nilai tertentu tidak ada. Seperti ketika ada fungsi di mana variabel integral ada, kita bisa memeriksanya di pernyataan penjaga dan mengembalikannya tidak ada. yaitu;Kami jika ada variabel, kami dapat menggunakan 'abc' dalam fungsi di luar lingkup penjaga.
sumber
age
adalah tipe opsional:Optional<Int>
jadi jika Anda membandingkannya dengan nil, ia mengembalikan false setiap kali memiliki nilai atau jika belum. Anda perlu membuka opsional untuk mendapatkan nilainya.Dalam contoh Anda, Anda tidak tahu apakah itu berisi nilai apa pun sehingga Anda dapat menggunakan ini sebagai gantinya:
sumber
Saya melakukan ini untuk mencetak nilai string (properti) dari pengontrol tampilan lain.
ViewController.swift
SecondViewController.swift
Hasil:
sumber
Lihat
guard
pernyataannya:sumber
Saat memiliki nilai default:
print("\(name) is \(age ?? 0) years old")
atau jika namanya opsional:
print("\(name ?? "unknown") is \(age) years old")
sumber
Saya mendapatkan Opsional ("String") di sel tampilan tabel saya.
Jawaban pertama bagus. Dan membantuku mengetahuinya. Inilah yang saya lakukan, untuk membantu pemula di luar sana seperti saya.
Karena saya membuat array di objek khusus saya, saya tahu bahwa itu akan selalu memiliki item di posisi pertama, jadi saya bisa memaksa membukanya ke variabel lain. Kemudian gunakan variabel itu untuk mencetak, atau dalam kasus saya, setel ke teks sel tampilan tabel.
Kelihatannya sangat sederhana sekarang, tapi butuh beberapa saat untuk saya pikirkan.
sumber
Ini bukanlah jawaban yang tepat untuk pertanyaan ini, tetapi satu alasan untuk masalah seperti ini. Dalam kasus saya, saya tidak dapat menghapus Opsional dari String dengan "if let" dan "guard let".
Jadi gunakan AnyObject daripada Any untuk menghapus opsional dari string dengan cepat.
Silakan lihat link untuk jawabannya.
https://stackoverflow.com/a/51356716/8334818
sumber