30

SwiftKit という名前のフレームワークがあるとします。このフレームワークには、someClassMethod という名前の UIView の拡張クラス メソッドと、その中に someProperty という名前のプロパティがあります。

// SwiftKit
public extension UIView {
    class func someClassMethod() {
        print("someClassMethod from Swift Kit")
    }

    var someProperty: Double {
        print("someProperty from Swift Kit")
        return 0
    }
}

また、SwiftFoundation という名前のフレームワークもあります。このフレームワークには、someClassMethod という名前の UIView の拡張クラス メソッドと、その中に someProperty という名前のプロパティがあります。

// SwiftFoundation
public extension UIView {
    class func someClassMethod() {
        print("someClassMethod from Swift Foundation")
    }

    var someProperty: Double {
        print("someProperty from Swift Foundation")
        return 0
    }
}

次に、これらのフレームワークを導入したプロジェクトを作成しました。両方を同じswiftファイルにインポートしてそれらの拡張機能にアクセスすると、呼び出しを指定しても、「someProperty/someClassMethod()のあいまいな使用」エラーが発生しましたSwiftKit.UIView.someClassMethod() の形式:

import UIKit
import SwiftKit
import SwiftFoundation

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.view.someProperty              // error: Ambiguous use of 'somProperty'
        SwiftKit.UIView.someClassMethod()   // error: Ambiguous use of 'someClassMethod()'
    }
}

それらの1つだけをインポートすると、あいまいなエラーはなくなりますが、さらに奇妙なことが起こります:

import UIKit
import SwiftKit
//import SwiftFoundation

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.view.someProperty
        SwiftKit.UIView.someClassMethod()
    }
}

コンソールの出力:

Swift Foundation の someProperty

Swift Foundation の someClassMethod

私の質問は次のとおりです:これらの拡張機能(クラス/インスタンスメソッド、プロパティの両方)をあいまいにせずに呼び出すにはどうすればよいですか? できない場合は、Objective-C で通常行うように、拡張機能名にプレフィックスを追加する必要があるということですか?

4

2 に答える 2

7

詳細

  • スウィフト 3、Xcode 8.1
  • スウィフト 4、Xcode 9.1
  • スウィフト 5.1、Xcode 11.2.1

問題

フレームワーク SwiftFoundation と SwiftKit のプロパティと関数の名前は同じです

決断

Way1

プロパティと関数に異なる名前を使用する

// SwiftFoundation
public extension UIView {
    public class func swiftFoundationSomeClassMethod() {
        print("someClassMethod from Swift Foundation")
    }

    public var swiftFoundationSomeProperty: Double {
        print("someProperty from Swift Foundation")
        return 0
    }
}

Way2

プロパティと機能をグループ化する

// SwiftKit
public extension UIView {
    public class SwiftKit {
        public class func someClassMethod() {
            print("someClassMethod from Swift Kit")
        }

        public var someProperty: Double {
            print("someProperty from Swift Kit")
            return 0
        }
    }

    var SwiftKit: SwiftKit { return SwiftKit() }
}

結果

import UIKit
import SwiftKit
import SwiftFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        _ = view.SwiftKit.someProperty
        UIView.SwiftKit.someClassMethod()

        _ = view.swiftFoundationSomeProperty
        UIView.swiftFoundationSomeClassMethod()
    }
}

計画

ここに画像の説明を入力 ここに画像の説明を入力

あなたの方法

SwiftFoundation.UIView.swiftFoundationSomeClassMethod()

両方のフレームワークのすべての UIView 拡張機能が UIView クラスに含まれているため、名前空間を使用するバリアントは正しくありません。以下の画像を見ると、SwiftFoundation 内に SwiftKit クラスと swiftFoundationSomeClassMethod() が表示されます。これは、他の開発者を混乱させる可能性があります。

ここに画像の説明を入力

于 2016-12-01T22:18:12.683 に答える