2016-04-13 20 views
36

Co to jest odpowiednik Swift Java .toString(), aby wydrukować stan instancji klasy?Swift odpowiednik Java .toString()

+0

More info @ http://stackoverflow.com/questions/24068506/how-can- i-change-the-textual-display-display-for-a-type-in-swift –

Odpowiedz

53

Właściwość description jest tym, czego szukasz. Jest to właściwość dostępna po wydrukowaniu zmiennej zawierającej obiekt.

Możesz dodać description do swoich własnych klas, przyjmując protokół CustomStringConvertible, a następnie wdrażając właściwość description.

class MyClass: CustomStringConvertible { 
    var val = 17 

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

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

description jest również używany podczas wywołania konstruktora String:

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

Jest to zalecana metoda dostępu opis instancji (w przeciwieństwie do myobj.description, które nie będą działać, jeśli klasa nie implementuj CustomStringConvertible)

+0

Co z 'String (obj)'? – nielsbot

+0

Istnieje również '.debugDescription' dla bardziej przyjaznej dla programisty wersji – nielsbot

+2

czy ma zastosowanie do struktur? – lmiguelvargasf

6

Powinieneś użyć String(obj).

Bezpośrednio z the documentation for CustomStringConvertible:

UWAGA

String (instancja) będzie działać na przykład dowolnego typu, wracając swojego opisu jeśli instancja bywa CustomStringConvertible. Używanie CustomStringConvertible jako ogólnego ograniczenia lub bezpośredni dostęp do opisu typu zgodnego z jest odradzane.

+0

Wygląda na to, że wystarczy metoda 'description()' z 'CustomStringConvertible'. –

4

Jeśli możliwe jest użycie struktury zamiast klasy, to nic więcej nie można zrobić.

struct tylko drukuje dobrze sobie z wyjściem

print("\(yourStructInstance)") 

lub z klasy tak:

print(String(describing: yourClassInstance))