2015-09-03 13 views
5

Bir Objective C uygulamasında kullanıyorum hızlı bir framework var.SÜREKLİ YAZILIM SADECE AŞAĞIDAKİ FONKSİYONLARI NASIL YAPILIR?

///Latitude in Decimal Degrees 
public var lat : Double? 

///Longitude in Decimal Degrees 
public var lon : Double? 

onlar opsiyoneldir çünkü Amaç C'ye erişilemiyor: İki params olan bir Location sınıf var. Burada çalışan sadece hızlı bir sınıf tutmayı umuyordum, bu yüzden "geçici çözüm" sınıf için de bazı @objc yöntemlerini ekleyecekti - ama onların hızlı erişilebilir olmasını istemiyorum.

1) çerçeve içine bu uzantıyı koymak olabilir ama diyoruz edememek swift "gizlemek" için bir yol vardır: Yani burada

///Objective C Extensions to allow easier Access 
extension LocationMessage { 

@objc var getLat : Double { 
    if (lat != nil) { 
     return lat! 
    } 
    return -91; 
} 

@objc var getLon : Double { 
    if (lon != nil) { 
     return lon!; 
    } 
    return -181; 
} 
} 

soru nedir?

2) Sanırım Objective C uygulamasına hızlı bir dosya yazabilirim - bu uzantıları sınıfa ekler - bu yol ne olacak?

3) Başka bir yolu var mı?

+0

söyleyebilirim Bu 2 numaralı yol gitmek. Özel uzantı yapmayı denediniz mi? –

cevap

3

Swift 3.1'den itibaren, @available özniteliği kullanılarak bu mümkündür. official documentation on attributes, birçok farklı seçeneğe işaret eder, ancak hepsini nasıl birleştirebileceğinizi açıklığa kavuşturmaz. bir hata verecektir sonradan Swift 3.1 sınıfını Foo kullanmaya çalışıyor ya,

@available(swift, obsoleted: 3.1) 
class Foo { 
    //... 
} 

Bu örnekte: Ancak this Swift evolution proposal, 3.1 uygulanan, Swift belli versiyonunun kadar eskimiş bir şey işaretleme anlatılır. olmaz Objective-C kullanmadan, oysa bir hata verecektir sonradan Swift 1.0 yöntemi exampleMethodWithObject: kullanmaya çalışıyor, bu örnekte

@available(swift, obsoleted: 1.0) 
@objc(exampleMethodWithObject:) 
static func exampleMethod(with object: NSObject) { 
    //... 
} 

ya: küçük bir ayarlama ile, bunu yapabiliriz. (.. Eğer gerçekten emin olmak istiyorsanız, obsoleted: 0.1 belirtebilirsiniz 0.0 kullanma veya çalışmıyor sürüm numarasını kapalı bırakarak) Böylece

kodunuz için, bu çalışması gerekir:

extension LocationMessage { 

    @available(swift, obsoleted: 1.0) 
    @objc var getLat : Double { 
     if (lat != nil) { 
      return lat! 
     } 
     return -91 
    } 

    @available(swift, obsoleted: 1.0) 
    @objc var getLon : Double { 
     if (lon != nil) { 
      return lon! 
     } 
     return -181 
    } 

} 
+1

'Hızlı' platformu yalnızca bu öznitelik için 4. adımdan beri kullanılabilir. Bu nedenle * kullanmalısınız ('geçersiz' bağımsız değişken yalnızca hızlı sürüm için çalışacaktır) – bananabastard

İlgili konular