Java'nın Swift eşdeğeri toString ()


Yanıtlar:


122

descriptionMülkiyet aradığınız budur. Bu, bir nesne içeren bir değişkeni yazdırdığınızda erişilen özelliktir.

descriptionProtokolü benimseyerek CustomStringConvertibleve ardından descriptionözelliği uygulayarak kendi sınıflarınıza ekleme yapabilirsiniz .

class MyClass: CustomStringConvertible {
    var val = 17

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

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

descriptionyapıcıyı çağırdığınızda da kullanılır String:

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

Bu, örnek açıklamasına erişmek için önerilen yöntemdir (bunun tersine, myobj.descriptionbir sınıf uygulanmazsa işe yaramaz CustomStringConvertible)


Peki ya String(obj)?
nielsbot

Orada da .debugDescriptionbir daha programcı dostu versiyon için
nielsbot

2
yapılar için geçerli mi?
lmiguelvargasf

1
Evet, CustomStringConvertible yazdırılabilir olarak değiştirildi. @Antonio, ne zaman değiştiğini hatırlamıyorum, ama kesinlikle Swift 3'ten çok önceydi.
vacawama

1
MyClass, NSObject'ten uzatılmalıdır
DàChún

7

Sınıf yerine yapı kullanmak mümkünse, yapacak ek bir şey yok.

struct çıktıya kendini iyi yazdırır

print("\(yourStructInstance)")

veya bunun gibi bir sınıfla:

print(String(describing: yourClassInstance))

6

Kullanmalısınız String(obj).

Doğrudan CustomStringConvertible belgelerinden :

NOT

String (örnek), herhangi bir türden bir örnek için çalışacak ve örnek CustomStringConvertible olursa açıklamasını döndürecektir. CustomStringConvertible'ı genel bir kısıtlama olarak kullanmak veya uygun bir türün açıklamasına doğrudan erişmek bu nedenle önerilmez.


description()Metodu CustomStringConvertibleyeterli olacak gibi görünüyor .
Greg Brown

5

NSObjectGenişletilmiş sınıflarla nasıl yapılır

Model sınıfınız 'den genişletilmişse NSObject, Değişkeni descriptionaşağıdaki gibi geçersiz kılmanız gerekir :

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}"
}

Sen bunu yapmış nasıl kontrol edebilirsiniz içinde burada Countrysınıfında yer, "CountryPicker iOS Swift kütüphanesinde" .

Veya anlamanızı kolaylaştırmak için sınıfınız ve descriptionyönteminiz aşağıdaki gibi görünmelidir:

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

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

Not: Modal sınıfınızı bundan genişlettiğiniz için artık sınıfınızın sınıfa NSObjectuymasını gerektirmez CustomStringConvertibleve descriptiondeğişkeni NSObjectsınıfın kendisinden geçersiz kılıyorsunuz . Her zaman hatırlayın, CustomStringConvertiblebunu başarmanın çoğunlukla saf Swift yolu olduğunu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.