我的功能如下:
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请求在主体中不返回任何内容,因此我试图找到一种方法来表达它,它使用我设置的通用函数
答案 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))
,空元组。