gpt4 book ai didi

swift 扩展 : same extension function in two Modules

转载 作者:IT王子 更新时间:2023-10-29 05:10:22 24 4
gpt4 key购买 nike

假设我有一个名为 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()'
}
}

如果我只导入其中一个,模棱两可的错误就会消失,但会发生一件奇怪的事情:

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

控制台打印出:

someProperty from Swift Foundation

someClassMethod from Swift Foundation

我的问题是:我怎样才能明确地调用这些扩展(类/实例方法、属性)?如果不能,是否意味着我们应该像通常使用 Objective-C 那样为扩展名称添加前缀?

最佳答案

详情

  • swift 3、Xcode 8.1
  • swift 4、Xcode 9.1
  • swift 5.1,Xcode 11.2.1

问题

frameworks SwiftFoundation 和SwiftKit 具有相同名称的属性和函数

决定

方式1

使用不同的属性和函数名称

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

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

方式2

对属性和函数进行分组

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

项目

enter image description here enter image description here

你的方法

SwiftFoundation.UIView.swiftFoundationSomeClassMethod()

您使用命名空间的变体是不正确的,因为来自两个框架的所有 UIView 扩展都包含在您的 UIView 类中。看下面的图片,你可以在 SwiftFoundation 中看到 SwiftKit 类和 swiftFoundationSomeClassMethod() 。这可能会使其他开发人员感到困惑。

enter image description here

关于 swift 扩展 : same extension function in two Modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32736698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com