Swift yang setara dengan Java toString ()

Jawaban:

123

The descriptionproperti adalah apa yang Anda cari. Ini adalah properti yang diakses saat Anda mencetak variabel yang berisi objek.

Anda dapat menambahkan descriptionke kelas Anda sendiri dengan mengadopsi protokol CustomStringConvertibledan kemudian mengimplementasikan descriptionproperti.

class MyClass: CustomStringConvertible {
    var val = 17

    public var description: String { return "MyClass: \(val)" }
}

let myobj = MyClass()
myobj.val = 12
print(myobj)  // "MyClass: 12"

descriptionjuga digunakan saat Anda memanggil Stringkonstruktor:

let str = String(myobj)  // str == "MyClass: 12"

Ini adalah metode yang direkomendasikan untuk mengakses deskripsi instance (kebalikan dari myobj.descriptionyang tidak akan berfungsi jika kelas tidak diimplementasikan CustomStringConvertible)

vacawama
sumber
Tentang apa String(obj)?
nielsbot
Ada juga .debugDescriptionuntuk versi yang lebih ramah programmer
nielsbot
2
apakah itu berlaku untuk struktur?
lmiguelvargasf
1
Ya, CustomStringConvertible menggantikan Printable. @Antonio, saya tidak ingat kapan itu berubah, tetapi itu pasti jauh sebelum Swift 3.
vacawama
1
MyClass harus diperpanjang dari NSObject
DàChún
7

Jika memungkinkan untuk menggunakan struct alih-alih kelas, maka tidak ada tambahan yang harus dilakukan.

struct hanya mencetak dengan baik sendiri ke output

print("\(yourStructInstance)")

atau dengan kelas seperti ini:

print(String(describing: yourClassInstance))
Andrew
sumber
6

Anda harus menggunakan String(obj).

Langsung dari dokumentasi untuk CustomStringConvertible :

CATATAN

String (instance) akan berfungsi untuk instance jenis apa pun, menampilkan deskripsinya jika instance tersebut adalah CustomStringConvertible. Oleh karena itu, menggunakan CustomStringConvertible sebagai batasan umum, atau mengakses deskripsi jenis yang sesuai secara langsung, tidak disarankan.

Ewan Mellor
sumber
Sepertinya description()metode CustomStringConvertibleakan cukup.
Greg Brown
5

Bagaimana itu dilakukan dengan NSObjectkelas yang diperluas

Jika kelas model Anda diperpanjang dari NSObject, Anda harus mengganti Variabel descriptionsebagai berikut:

public override var description: String {
    return "\n{\n index: \(self.index),\n"
        + " country: \(self.name),\n"
        + " isoCountryCode: \(self.isoCountryCode),\n"
        + " localeId: \(self.localeId),\n"
        + " flagImageName: \(self.flagImageName!)\n}"
}

Anda dapat memeriksa bagaimana saya melakukannya di sini di dalam Countrykelas , di "Perpustakaan Swift iOS CountryPicker" .

Atau, untuk memudahkan Anda dalam memahaminya, class dan descriptionmetode Anda akan terlihat seperti berikut:

public class MyClass: NSObject {
   public var memberAttribute = "I'm an attribute"

   public override var description: String {
       return "My Class member: \(self.memberAttribute)"
   }
}

Catatan: Karena Anda memperluas kelas Modal Anda dari NSObjectitu, kelas Anda tidak perlu CustomStringConvertiblelagi mematuhi kelas, dan Anda descriptionmengganti variabel dari NSObjectkelas itu sendiri. Selalu ingat, CustomStringConvertiblesebagian besar adalah cara Swift murni untuk mencapai ini.

Randika Vishman
sumber