2015-09-03 24 views
5

我有一個快速框架,我在Objective C應用程序中使用它。我有一個Location類有兩個參數:如何將swift函數僅暴露給objc

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

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

,因爲他們是自選這是不是Objective C的訪問。我希望保持一個快速的班級在這裏工作,所以我的「解決方法」是爲班級添加一些@objc方法 - 但我不希望他們快速訪問。

///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; 
} 
} 

因此,這裏的問題:

1)我可以把這個延伸到框架中,但有一些方法來「隱藏」從能夠調用它迅速?

2)我想我可以寫一個swift文件到我的Objective C應用程序中 - 將擴展添加到類中 - 這是否應該走?

3)有沒有另一種方法?

+0

,我會說這個數字2是要走的路。你有沒有嘗試讓擴展私人? –

回答

3

從Swift 3.1開始,可以使用@available屬性。 official documentation on attributes提到了很多不同的選項,但沒有說清楚如何組合所有這些選項。然而this Swift evolution proposal,在3.1中實現,討論標記爲過時的某一特定版本雨燕的東西:

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

在這個例子中,試圖使用類Foo在雨燕3.1或更高版本會給出錯誤。隨着一點點的調整,我們可以這樣做:

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

在這個例子中,試圖使用方法exampleMethodWithObject:在雨燕1.0或更高版本會給出錯誤,而在Objective-C使用它不會。爲您的代碼(如果你真的想可以肯定,你可以指定obsoleted: 0.1使用0.0或離開關閉的版本號不工作)

所以,這應該工作:

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

「swift」平臺僅適用於自swift 4以來的這個屬性。所以你應該使用*而不是('obsoleted'參數僅適用於swift版本,所以它會起作用) – bananabastard