Swift yansımayı destekliyor mu? örneğin gibi orada bir şeydir valueForKeyPath:ve setValue:forKeyPath:Swift nesneler için?
Aslında obj.classObjective-C'de olduğu gibi dinamik bir tip sistemi var mı?
Swift yansımayı destekliyor mu? örneğin gibi orada bir şeydir valueForKeyPath:ve setValue:forKeyPath:Swift nesneler için?
Aslında obj.classObjective-C'de olduğu gibi dinamik bir tip sistemi var mı?
Yanıtlar:
Görünüşe göre bazı yansıma desteğinin başlangıcı var:
class Fruit {
var name="Apple"
}
reflect(Fruit()).count // 1
reflect(Fruit())[0].0 // "name"
reflect(Fruit())[0].1.summary // "Apple"
Mchambers gist'ten buraya: https://gist.github.com/mchambers/fb9da554898dae3e54f2
Mirroraslında kelimeyi IDEbirkaç kez alıntılar .
_stdlib_getTypeName.
Bir sınıf genişlerse NSObject, Objective-C'nin tüm iç gözlemi ve dinamizmi çalışır. Bu içerir:
Bu işlevin bir dezavantajı, Swift isteğe bağlı değer türlerinin desteklenmesidir. Örneğin, Int özellikleri numaralandırılabilir ve değiştirilebilir ancak Int? özellikler olamaz. İsteğe bağlı türler, yansıtma / MirrorType kullanılarak kısmen numaralandırılabilir, ancak yine de değiştirilemez.
Bir sınıf genişlemezse NSObject, yalnızca yeni, çok sınırlı (ve devam etmekte olan?) Yansıtma çalışır (bkz. Yansıtma / MirrorType), bu da bir örneğe sınıfı ve özellikleri hakkında soru sorma konusunda sınırlı bir yetenek ekler, ancak yukarıdaki ek özelliklerin hiçbiri .
NSObject'i genişletmediğinde veya '@objc' direktifini kullanmadığında, Swift varsayılan olarak statik ve vtable tabanlı gönderime geçer. Bu daha hızlıdır, ancak bir sanal makinenin yokluğunda çalışma zamanı yönteminin kesilmesine izin vermez. Bu müdahale, Cocoa'nın temel bir parçasıdır ve aşağıdaki özellik türleri için gereklidir:
Bu nedenle, Swift ile uygulanan Cocoa / CocoaTouch uygulamalarındaki sınıfların:
Özet:
Referans verileri: Yöntem çağrıları için yürütme ek yükü:
(gerçek performans donanıma bağlıdır, ancak oranlar benzer kalacaktır).
Ayrıca, dinamik öznitelik, Swift'e bir yöntemin dinamik gönderimi kullanması gerektiğini açıkça bildirmemize olanak tanır ve bu nedenle durdurmayı destekleyecektir.
public dynamic func foobar() -> AnyObject {
}
Dokümantasyon, dinamik tip sistemden bahsediyor, özellikle
Type ve dynamicType
Bkz (Dil Başvurusu) Metatype Tipi
Misal:
var clazz = TestObject.self
var instance: TestObject = clazz()
var type = instance.dynamicType
println("Type: \(type)") //Unfortunately this prints only "Type: Metatype"
Şimdi varsayarak TestObjectuzanırNSObject
var clazz: NSObject.Type = TestObject.self
var instance : NSObject = clazz()
if let testObject = instance as? TestObject {
println("yes!") //prints "yes!"
}
Şu anda herhangi bir yansıma uygulanmamaktadır.
DÜZENLEME: Görünüşe göre yanılmışım, stevex'in cevabına bakın. Muhtemelen IDE'lerin nesne içeriklerini incelemesine izin vermek için yerleşik özellikler için bazı basit salt okunur yansıma vardır.
Görünüşe göre Swift yansıtma API'si şu anda Apple için yüksek bir öncelik değil. Ancak @stevex cevabının yanı sıra , standart kitaplıkta yardımcı olan başka bir işlev daha var.
Beta 6 _stdlib_getTypeNameitibariyle bir değişkenin karıştırılmış tür adını alır. Bunu boş bir oyun alanına 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ı:
TypeName0 = NSString
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass
TypeName2 = _TtSi
TypeName3 = _TtSS
Ewan Swick'in blog yazısı şu dizeleri deşifre etmeye yardımcı olur:
örneğin _TtSi, Swift'in dahili Inttürünü ifade eder.
Mike Ash'in aynı konuyu kapsayan harika bir blog girişi var .
Bunun yerine toString () kullanmayı düşünebilirsiniz . Herkese açıktır ve _stdlib_getTypeName () ile aynı şekilde çalışır, farkı, aynı zamanda AnyClass üzerinde de çalışır , örneğin Playground enter'da
class MyClass {}
toString(MyClass.self) // evaluates to "__lldb_expr_49.MyClass"
reflectSwift 5'te anahtar kelime yok , şimdi kullanabilirsiniz
struct Person {
var name="name"
var age = 15
}
var me = Person()
var mirror = Mirror(reflecting: me)
for case let (label?, value) in mirror.children {
print (label, value)
}
jsonseri kaldırma