protocol extensions extension swift namespaces swift-extensions

extensions - swift file extension



Swift Extension: la misma función de extensión en dos módulos (1)

Detalles

  • Swift 3, Xcode 8.1
  • Swift 4, Xcode 9.1

Problema

SwiftFoundation y SwiftKit tienen los mismos nombres que las propiedades y funciones

decisión

Way1

Usa diferentes nombres de las propiedades y funciones.

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

Agrupa las propiedades y funciones.

// 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() } }

Resultado

import UIKit import SwiftKit import SwiftFoundation class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() _ = view.SwiftKit.someProperty UIView.SwiftKit.someClassMethod() _ = view.swiftFoundationSomeProperty UIView.swiftFoundationSomeClassMethod() } }

Proyecto

Tu metodo

SwiftFoundation.UIView.swiftFoundationSomeClassMethod()

Su variante de usar los espacios de nombres no es correcta porque todas las extensiones UIView de ambos marcos se incluyen en su clase UIView. Mira la imagen de abajo, puedes ver la clase SwiftKit y swiftFoundationSomeClassMethod () dentro de SwiftFoundation. Esto puede confundir a otros desarrolladores.

Digamos que tengo un Framework llamado SwiftKit, que tiene un método de clase de extensión UIView llamado someClassMethod y una propiedad llamada someProperty dentro de él:

// SwiftKit public extension UIView { class func someClassMethod() { print("someClassMethod from Swift Kit") } var someProperty: Double { print("someProperty from Swift Kit") return 0 } }

Y también tengo un Framework llamado SwiftFoundation, que también tiene un método de clase de extensión de UIView llamado someClassMethod y una propiedad llamada someProperty dentro de él:

// SwiftFoundation public extension UIView { class func someClassMethod() { print("someClassMethod from Swift Foundation") } var someProperty: Double { print("someProperty from Swift Foundation") return 0 } }

Luego creé un proyecto que introdujé estos Frameworks, las cosas son, si los importo en el mismo archivo swift y accedo a esas extensiones, obtuve el error "Uso ambiguo de someProperty / someClassMethod ()", incluso si especificé la llamada en la forma de 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()'' } }

Si solo importa uno de ellos, el error ambiguo desaparece, pero sucede algo más extraño:

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() } }

La consola imprime:

algo de propiedad de Swift Foundation

someClassMethod de la Fundación Swift

Mi pregunta es: ¿Cómo puedo llamar a estas extensiones (método de clase / instancia, propiedades) sin ambiguo? Si no puedo, ¿significa que deberíamos agregar un prefijo a los nombres de extensión como normalmente hacemos con Objective-C?