2016-07-12 19 views
2

私は2つの異なる第三者フレームワークを使用するXCode 7.3でSwift 2プロジェクトを持っています。Swiftの拡張プロパティ競合サブクラス宣言

'FrameworkA' は、このようcornerRadiusプロパティを宣言公共UIView拡張を宣言します。

extension UIView { 
    var cornerRadius: CGFloat { 
     get { return self.layer.cornerRadius } 
     set(cornerRadius) { 
      self.layer.masksToBounds = true 
      self.layer.cornerRadius = cornerRadius 
     } 
    } 
} 

'FrameworkB' cornerRadiusプロパティを持つUIViewサブクラス宣言しています。

class TagView: UIView { 
    var cornerRadius: CGFloat = 0 { 
     didSet { 
      layer.cornerRadius = cornerRadius 
      layer.masksToBounds = cornerRadius > 0 
     } 
    } 
} 

どちらのフレームワークはのように完全に罰金コンパイルを彼らはお互いを知りません。しかし、私のコードで「FrameworkB」プロパティを使用しようとすると:

それはエラーで失敗し
let view = UIView() 
view.cornerRadius = 10 // FrameworkA: Ok 

let tagView = TagView(title: "") 
tagView.cornerRadius = 10 // Compilation error 
(tagView as UIView).cornerRadius = 10 // FrameworkA: Ok 

:私は「FrameworkA」拡張プロパティのタイプキャストを呼び出すことができるよ

Ambiguous use of 'cornerRadius'

UIViewになりますが、このファイルで 'FrameworkA'をインポートしなくても 'FrameworkB'クラスプロパティを呼び出すことができません。プロジェクトのどこかで 'FrameworkA'をインポートするとすぐに失敗します。

'FrameworkB'メソッドを使用するか、Swiftファイルで 'FrameworkA'をインポートしないようコンパイラに明示的に指示する方法はありますか?

編集:あなたが(それぞれFrameworkAとFrameworkB)WakupTagListViewポッドを使用して、上記のコードを実行しようとすることができ、それを再現します。

+0

あなたは '(TagViewなどtagView).cornerRadius = 10 '、または'(TagListView.TagViewなどtagView).cornerRadius = 10' –

+0

@LukeVanIn同じエラーを使用した場合はどうなります。 'tagView'はすでに' TagView'であるので、私はそれが何らかの違いをもたらすとは思わない。 – redent84

答えて

1

私の現在の解決策は、同じプロジェクト内に動的フレームワークターゲット 'ProxyFramework'を作成することです。私はCocoapodsを使用して「FrameworkB」依存関係を追加して、「FrameworkA」で宣言拡張メソッドとの競合をしない新しいプロパティ宣言:私の適用対象で

public extension TagList { 
    public dynamic var cornerRadius_: CGFloat { 
     get { return cornerRadius } 
     set { cornerRadius = newValue } 
    } 
} 

を、私は 'に新しく作成されたフレームワークターゲットを追加しますターゲットの依存関係このプロキシフレームワークを介しFrameworkB 『プロパティ、ので、私は今、使用することができるよ』:

let view = UIView() 
view.cornerRadius = 10 // FrameworkA: Ok 

let tagView = TagView(title: "") 
tagView.cornerRadius_ = 10 // ProxyFramework -> FrameworkB: Ok 
(tagView as UIView).cornerRadius = 10 // FrameworkA: Ok 

私はクリーンな解決策を見てみたいです。

0

これらの異なるクラスを無関係な場所で使用している場合、特定のシンボルを実際に必要とするソースファイルにのみインポートすることができます。

import class FrameworkA.TagView 
関連する問題