SORU
7 HAZİRAN 2014, CUMARTESİ


Nasıl bir nesne (Swift) türü öğrenebilirim?

Bir programı anlamaya çalışırken, ya da bazı köşe durumlarda aslında yararlı bir şey bulmak mümkün. Biliyorum hata yapabileceğini gösterin, bazı tür bilgi ve genellikle güveniyor tür kesmesi için yanına belirtme yazın bu durumlarda, ama yine de istiyorum bir şey gibi python type()

Sorun adil bir miktar genel olarak Swift içgözlem:) sergiyi yaşıyorum

dynamicType (this question)

Güncelleme:bu Swift şimdi seni türü için bir referans verir ve dinamik türü ile örneği olmayan yeni bir sürümü değiştirildi.

Bu en umut verici görünüyor, ama şimdiye kadar gerçek türü bulmak mümkün olmamıştır

class myClass {
    var count = 0
}

let mc = myClass()

# update: this now evaluates as true
mc.dynamicType === myClass.self

verimleri hata:

Playground execution failed: error: <REPL>:10:16: error: could not find an 
overload for '===' that accepts the supplied arguments
mc.dynamicType === myClass.self
~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~

ille de eşit değiller, ama onları karşılaştırmak için bir yol yoktur anlamına gelmez. Bir şey öğrenemedik daha :(

Ben de yeni bir nesne oluşturmak için bir sınıf referans olarak kullanmaya çalıştıyokiş, ama garip bir şekilde bana bir hata required bir başlatıcı eklemek zorundayım söyledi:

çalışır:

class myClass {
    var count = 0
    required init() {
    }
}

let myClass2 = myClass.self
let mc2 = myClass2()

Aslında herhangi bir nesne türünü keşfetme yolunda hala sadece küçük bir adım olsa da

Güncelleme:aşağıdaki artık çalışmıyor...

Bazı insanlar .dynamicType.printClassName() ama benim için bir hata üretir düşündüren gibi oldum da

mc2.dynamicType.printClassName()

hata:

Playground execution failed: error: <REPL>:13:5: error: 'myClass.Type' 
does not have a member named 'printClassName'
mc2.dynamicType.printClassName()
    ^           ~~~~~~~~~~~~~~

Edit: dynamicType yanlış anlamışım. Aslında sadecebir şekilde çalışma zamanı tür erişmek içindeğişken. Örneğin:

class BaseClass {
  var x = 1
  func foo() {
    println("hello")
  }
}
class SubClass: BaseClass {
  var y = 9
  func foo() {
    println("hola")
  }
}
let x: BaseClass = SubClass()

// prints "hello"
x.foo() 

// Error:
print(x.y)

// prints "hola"
x.dynamicType.foo()

// totally fine:
print(x.dynamicType.y)

CEVAP
8 HAZİRAN 2014, Pazar


"DynamicType."kod Swift kitapta bir örnek. printClassName Doğrudan özel bir sınıf adı kapmak için biliyorum, ama örnekleri bir tür "aşağıda gösterildiği gibi" sözcüğünü kullanarak kontrol edebilirsiniz yolu vardır hayır Bu örnekte de eğer gerçekten bir dize olarak sınıf adı istiyorsanız code özel bir işlevi uygulamak için nasıl gösterir.

class Shape {
    class func className() -> String {
        return "Shape"
    }
}

class Square: Shape {
    override class func className() -> String {
        return "Square"
    }
}

class Circle: Shape {
    override class func className() -> String {
        return "Circle"
    }
}

func getShape() -> Shape {
    return Square() // hardcoded for example
}

let newShape: Shape = getShape()
newShape is Square // true
newShape is Circle // false
newShape.dynamicType.className() // "Square"
newShape.dynamicType.className() == Square.className() // true

NSObject amacı zaten kendi code onların işlevi uygulamak unutmayın. Eğer Kakao ile çalışıyorsanız, sadece bu özelliği kullanabilirsiniz.

class MyObj: NSObject {
    init() {
        super.init()
        println("My class is \(self.className)")
    }
}
MyObj()

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • Professor Messer

    Professor Me

    27 NİSAN 2007
  • TheXiaxue

    TheXiaxue

    3 AĞUSTOS 2009