2015-09-03 10 views
5

私はObjective Cアプリケーション内で使用している迅速なフレームワークを持っています。swift関数をobjcにのみ公開する方法

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

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

彼らはoptionalsであるため、Objective Cのにアクセスすることはできません:私は2つのparamsを持ってLocationクラスを持っています。私はここで働いている迅速なクラスだけを保つことを望んでいますので、私の "回避策"は、クラスのメソッド@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)私はObjective Cアプリケーションに素早くファイルを書き込むことができたと思います。これは、クラスに拡張機能を追加する方法ですか?

3)別の方法がありますか?

+0

を私が言いますその数は2番です。あなたは拡張プライベートをしようとしましたか? –

答えて

3

Swift 3.1以降は、@available属性を使用してこれを行うことができます。 official documentation on attributesにはさまざまなオプションがありますが、それらをすべてどのように組み合わせるかは明確ではありません。しかし、3.1で実装this Swift evolution proposalは、スウィフトの特定のバージョンのと同じくらい時代遅れなものマーキングについて説明します。この例では

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

を、スウィフト3.1以降でクラスFooを使用しようとするとエラーになります。しませんObjective-Cでそれを使用するのに対し、エラーになります、後スウィフト1.0方法exampleMethodWithObject:を使用しようと、この例では

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

のか:少し調整で、我々はこれを行うことができます。 (あなたが本当に確認したい場合は、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以降、この属性でのみ使用できます。*の代わりに*を使用する必要があります( '廃止された'引数はswift版のみのため動作します) – bananabastard

関連する問題