当前位置: 首页 > 知识库问答 >
问题:

在协议扩展中将nil传递给带有可选一般约束参数的函数

彭华皓
2023-03-14

我有一种情况,我在协议中声明了两个函数,其中一个接受可选的一般约束参数,另一个函数不接受参数,但需要在扩展中实现为默认函数,它调用带有参数的函数并传递nil。但是我得到了这个错误:

传递给不带参数的调用的参数

我的代码:

public protocol MenuAccessible {
    var menuEntryViewController: UIViewController { get }
}

public protocol MenuTabBarControllerProtocol {
    func reloadTabs<T>(from uiProvider: T?) where T: MenuAccessible
    func reloadTabs()
}

public extension MenuTabBarControllerProtocol {
    func reloadTabs() {
        reloadTabs(from: nil) // error here, can't infer type
    }
}

显然,编译器无法推断出类型。例如,如果我传递一个所需类型的< code > nil (< code > Optional ),那么编译器会很高兴。例如:

struct MenuAccessibleObject: MenuAccessible {
    var menuEntryViewController: UIViewController { return UIViewController() }
}

public extension MenuTabBarControllerProtocol {
    func reloadTabs() {
        let menuAccessible: MenuAccessibleObject? = nil
        reloadTabs(from: menuAccessible) // passes nil, but compiler is happpy
    }
}

有没有一种方法可以在我的默认函数实现中传递nil,而不必创建那个虚拟对象

共有1个答案

梅庆
2023-03-14

我不明白为什么你在那里使用GenericT,如果你定义类型是MenuAccesable

下面是一个简单的编译器,没有任何问题

public protocol MenuAccessible {
    var menuEntryViewController: UIViewController { get }
}

public protocol MenuTabBarControllerProtocol {
    func reloadTabs(from uiProvider: MenuAccessible?)
    func reloadTabs()

}

public extension MenuTabBarControllerProtocol {
    func reloadTabs() {
        reloadTabs(from: nil)
    }

}

public extension MenuTabBarControllerProtocol {
    func reloadTabs(from uiProvider: MenuAccessible?)  {
        fatalError() // implement me
    }
}

编辑

我不知道这是否适合您,但请尝试一下

public protocol MenuAccessible {
    var menuEntryViewController: UIViewController { get }
}


public class UIProvider:NSObject {

}

public protocol MenuTabBarControllerProtocol {

    func reloadAllTheItems<T>(from uiProvider: T?) where T: UIProvider, T: MenuAccessible
    func reloadTabs()
}

public extension MenuTabBarControllerProtocol {

    func reloadTabs() {
        self.reloadAllTheItems(from: Temp())
    }

    func reloadAllTheItems (provider:(UIProvider &  MenuAccessible)) {

    }


}

class Temp: (UIProvider &  MenuAccessible) {
    var menuEntryViewController: UIViewController {
        return UIViewController()
    }

}
 类似资料:
  • 我正在尝试创建自己的复合验证注释来验证字符串——到目前为止,它由注释@NotNull、@NotBlank和@Size组成 但是,我不想让它们保持默认值,而是希望能够传入一个参数值,例如,如果我执行@ValidString(min=1,max=50),那么@Size注释可以读取这些值——这可能吗? 我的约束-

  • 让我们假设下面的方法(从番石榴的Iterables说): 这个系列: 然后编译以下代码并正确导出泛型 (在Guava中,这将返回< code>objs中所有字符串的iterable。) 但是现在让我们假设以下类: 我不知道如何调用并获取

  • 在Swift编程语言中,它说: 函数也可以接受可变数目的参数,将它们收集到数组中。 当我用逗号分隔的数字列表(`sumof(1,2,3,4)调用这样一个函数时,它们在函数中作为一个数组可用。 问题:如果我已经有一个数组要传递给这个函数,该怎么办? 这将失败,并出现编译器错误,“无法找到接受所提供参数的'__conversion'的重载”。有没有办法把一个现有的数组变成一个我可以传递给一个变量函数的

  • 问题内容: 我想将传递给function()的所有参数作为参数传递给内部的另一个function(), 这可以在被调用过程中完成并将它们传递给,但是还有另一种方法吗? 本来 但是如果我的func1签名是 我如何将它们全部发送到func2,而不使用 有没有一种方法像在javascript中? 问题答案: 显式比隐式更好, 但是如果您真的不想键入一些字符,请执行以下操作: 都是局部变量,因此您不能在调

  • 我必须将一个协议作为参数传递给一个函数。协议是泛型的,具有关联的类型。我找不到一个好办法。 我想要实现的基本上是在JSON中存储一个键值对。所以我有一个通用的数据类型协议,它设置/获取值(根据数据类型设置和获取) 在另一个协议中,我希望将这个泛型数据类型协议作为函数参数传递。 在下面的代码中,我得到的协议“dataType”只能用作泛型约束,因为它有自身或关联的类型要求

  • 问题内容: 在Objective-C中,我知道如何传递as参数: 但是在Swift中没有更多类型了。 如何在不知道是哪个的情况下将协议作为参数传递? 问题答案: 在您的评论之一中,您说: “我想创建一个方法,该方法返回实现所需协议的类类型的数组。” 您是否尝试过以下方法: 然后使用上述结构: 起作用的棘手部分是“ @objc”,它将协议暴露给目标c运行时,并允许我们传递任何“协议类型”作为参数。