如何将nil作为可选的泛型函数参数传递

时间:2018-10-01 20:32:52

标签: swift generics optional

我的功能如下:

func request<D: Decodable>(from urlString: String,
                           useToken: Bool = false,
                           requestType: RequestType = .get,
                           body: Data? = nil,
                           expecting type: D.Type? = nil,
                           completion: @escaping (Result<D?>) -> Void)

是否可以这样做:request(..., expecting: nil)func request<D: Decodable>(... expecting type: D.Type? = nil)

我认为我在使用泛型方面已经达到了限制,因为执行此操作时会遇到与我正在处理的代码完全无关的编译错误,因此我认为编译器可能会感到困惑

使用诸如request(from: "https:..", requestType: .post, body: body)之类的函数时,编译器会抱怨Enum element 'post' cannot be referenced as an instance member

我的一些API请求在主体中不返回任何内容,因此我试图找到一种方法来表达它,它使用我设置的通用函数

2 个答案:

答案 0 :(得分:0)

这对我在操场上很好

 let t = testStruct.init()
   let t2 : testStruct? = nil
   test(t)
   testOptional(t)
   testOptional(t2)

func test<T: testProtocol>(_ para: T){
    print(para.id())
}
func testOptional<T: testProtocol>(_ para: T?){
    if let p = para{
        print(p.id())
    }
}
protocol testProtocol {
    func id() -> String
}
struct testStruct{

}
extension testStruct : testProtocol {
    func id() -> String {
        return "hello"
    } 
}

但是您不能只调用testOptional()。它必须传递一些东西,甚至是nil可选的东西,以便可以推断出类型。

答案 1 :(得分:0)

这里的根本问题是,您想要的类型是Void,但Void不可解码,并且您不能将其设置为Decodable,因为无法扩展非标称类型(如Void)。这只是Swift的当前限制。

对此的正确解决方案是重载。创建两个方法:

int i;

创建另一个将请求转换为数据并且可以调用的共享方法

for (i = 0; i < str.size(); i++)

您的解码请求功能现在将{转换为count = 0;。您的非解码请求函数将丢弃数据(或者,如果您对它有迷信的话,可能会确保它为空),然后调用完成处理程序。

如果您希望代码更加并行,以便它始终传递结果而不是错误?,那么仍然可以通过对签名进行调整来实现:

bool charAlreadyExist = false;

但是过载仍然是答案。


(旧答案) 只要可以以某种方式推断出for(int l = 0; l < charachters.size(); l++),在这里传递{就没有问题。但是必须有一种推断if(charachters.at(l) == str.at(i))的方法。例如,以下应该没问题:

{

这将是不好的:

charAlreadyExist = true;

因为在这种情况下,无法确定break;是什么。

也就是说,鉴于您的目标,您始终不希望}是可选的。正如您所说,有时结果是“什么也不返回”。 “不返回任何内容”的正确类型是},而不是nil。

if (charAlreadyExist == false)

(我假设您是要{而不是for(int j = 0; j < str.size(); j++),但根据您的确切用例,两者可能都是正确的。)

{是Swift中的普通类型。它是一种只有一个值的类型:if (str.at(i) == str.at(j)),空元组。