2014-06-07 19 views
18

class bir örnek değişkenin Swift'de ne olduğunu anlatmanın kolay bir yolu var mı? Kullanmakta olduğum JVM tabanlı dillerde, sınıfını almak için println(value.class) gibi bir şey yapabilirsiniz.Bir örnek değişkeni sınıfının Swift'de ne olduğunu nasıl anlarım?

Swift'de eşdeğer bir şey var mı?

Dokümanlarda bulabildiğim en yakın şey, is <Class> keyword ile "tip denetimi" yapabilmektir, ancak bu sadece biraz tahmin etmeme yardımcı olur.

Bir tür sınıfım olduğunu düşündüğüm, ancak aslında başka bir tane olduğunu ve kesin olarak nasıl bileceğimi bilemediğim bir oyun etrafında oynayarak bir few situations koştum.

+0

olası bir kopyası [Swift'de bir değişkenin sınıfını nasıl alabilirim?] (Http://stackoverflow.com/questions/24097825/how-to-get-the-class-of-a-variable-in- swift) –

+3

Teşekkürler David, aramamda bunu görmemiştim. Benzer bir soru, ama tam olarak aynı değil. Bu, bir sınıfın belirli bir tür olup olmadığını test etmektir (yukarıda belirttiğim '', 'kullanarak). Test etmek istemiyorum, sınıf adını yazdırmak istiyorum, böylece ne olduğunu görebiliyorum. –

cevap

25

Tür düzeyinde bir bağımsız değişken kabul eden bir yönteme iletilebilen bir tür döndürmek için type.self kullanın. Örneğin, UILabel.self, isKindOfClass yöntem çağrısı geçirilebilir. sınıfın dize gösterimi dynamicType.description() yoluyla bulunabilir:

var label = UILabel() 
println(label.dynamicType.description()) 
println(label.isKindOfClass(UILabel.self)) 

Swift-3 İşte

var label = UILabel() println(type(of: label).description()) 

Output
UILabel
true

biraz daha bilgi - Dikkat edilmesi gereken iki ifadeler vardır: postfix kendini ifade ve dinamik tip ifadesi. the docs Gönderen:

Postfix Self
A postfix self expression consists of an expression or the name of a type, immediately followed by .self. It has the following forms:

expression.self 
type.self 

The first form evaluates to the value of the expression. For example, x.self evaluates to x.

The second form evaluates to the value of the type. Use this form to access a type as a value. For example, because SomeClass.self evaluates to the SomeClass type itself, you can pass it to a function or method that accepts a type-level argument



Dyamic Type Expression
A dynamicType expression consists of an expression, immediately followed by .dynamicType. It has the following form:

expression.dynamicType 

The expression can’t be the name of a type. The entire dynamicType expression evaluates to the value of the runtime type of the expression.

+1

Test durumu için bir 'açıklama()' göremiyorum, listemize izin verdim: String [] = ["foo", "bar", "baz"]; let cdr = list [1..2]; println (cdr.dynamicType.description()); 'ama aldığım hata (' error: 'Slice .Type' 'description'' adlı bir üye yok) bana ihtiyacım olan bilgiyi verir Bunu doğru bir şekilde işaretliyorum, teşekkürler! –

+0

@TedNaleid Yep. Bazı sınıflar üzerinde ayarlanmış bir açıklama fonksiyonu vardır, bazıları yoktur. Bu dil için hala erken günler ve gelecekte daha iyi yansıma desteği olacağını umuyorum. – memmons

+1

@TedNaleid: 'description()', 'NSObject' sınıfının bir yöntemi olarak bildirilir; bu,' .DynamicType.description() 'ifadesini' NSObject' alt sınıfı olan derleme zamanı türüyle yalnızca kullanabilirsiniz.'cdr',' NSObject' alt sınıfının bir sınıfı bile olmayan bir tür 'Dilim ' türüne sahiptir. – newacct

6

beta itibarıyla 6 _stdlib_getTypeName bir değişkenin parçalanmış tür adı alır. boş oyun yapıştırın:

import Foundation 

class PureSwiftClass { 
} 

var myvar0 = NSString() // Objective-C class 
var myvar1 = PureSwiftClass() 
var myvar2 = 42 
var myvar3 = "Hans" 

println("TypeName0 = \(_stdlib_getTypeName(myvar0))") 
println("TypeName1 = \(_stdlib_getTypeName(myvar1))") 
println("TypeName2 = \(_stdlib_getTypeName(myvar2))") 
println("TypeName3 = \(_stdlib_getTypeName(myvar3))") 

çıktısı:

ör:

TypeName0 = NSString 
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass 
TypeName2 = _TtSi 
TypeName3 = _TtSS 

Ewan Swick's blog entry bu dizeleri deşifre olur _TtSi, Swift'in dahili Int türünü temsil eder.

Mike Ash has a great blog entry covering the same topic.

+1

Bir hatam var: 'çözülmemiş tanımlayıcıyı kullanın _stdlib_getTypeName' –

İlgili konular