Qual é o equivalente Swift de Java toString()para imprimir o estado de uma instância de classe?
Qual é o equivalente Swift de Java toString()para imprimir o estado de uma instância de classe?
Respostas:
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)
String(obj)?
.debugDescriptionuma versão mais amigável ao programador
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.
description()método de CustomStringConvertibleseria suficiente.
NSObjectaulas estendidasSe 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.