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?