Equivalente Swift de toString Java ()

Respostas:

128

O descriptionimóvel é o que procura. Esta é a propriedade que é acessada quando você imprime uma variável contendo um objeto.

Você pode adicionar descriptionàs suas próprias classes adotando o protocolo CustomStringConvertiblee, em seguida, implementando a descriptionpropriedade.

class MyClass: CustomStringConvertible {
    var val = 17

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

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

descriptiontambém é usado quando você chama o Stringconstrutor:

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

Este é o método recomendado para acessar a descrição da instância (ao contrário do myobj.descriptionque não funcionará se uma classe não implementar CustomStringConvertible)

Vacawama
fonte
Sobre o quê String(obj)?
Nielsbot
Há também .debugDescriptionuma versão mais amigável ao programador
nielsbot
2
aplica-se a estruturas?
lmiguelvargasf
1
Sim, CustomStringConvertible substituiu Printable. @Antonio, não me lembro quando mudou, mas certamente foi muito antes do Swift 3.
vacawama
1
a MyClass deve ser estendida de NSObject
DàChún
7

Se for possível usar a estrutura em vez da classe, nada adicional a fazer.

struct apenas imprime bem na saída

print("\(yourStructInstance)")

ou com classe como esta:

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

Você deve usar String(obj).

Direto da documentação para CustomStringConvertible :

NOTA

String (instância) funcionará para uma instância de qualquer tipo, retornando sua descrição se a instância for CustomStringConvertible. Usar CustomStringConvertible como uma restrição genérica ou acessar a descrição de um tipo em conformidade diretamente é, portanto, desencorajado.

Ewan Mellor
fonte
Parece que o description()método de CustomStringConvertibleseria suficiente.
Greg Brown,
5

Como isso é feito com NSObjectaulas estendidas

Se sua classe de modelo for estendida de NSObject, você deve substituir a variável da descriptionseguinte maneira:

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

Você pode conferir como eu fiz isso aqui na Countryaula , na "Biblioteca CountryPicker iOS Swift" .

Ou, para torná-lo mais simples de entender, sua classe e descriptionmétodo devem ser assim:

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

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

Nota: Como você está estendendo sua classe Modal, NSObjectela não exige mais que sua classe esteja em conformidade com a CustomStringConvertibleclasse e você está substituindo a descriptionvariável da NSObjectprópria classe. Lembre-se sempre de que CustomStringConvertibleé principalmente a maneira pura do Swift de conseguir isso.

Randika Vishman
fonte