Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在这种情况下,我不能推断的类型是什么?_Swift - Fatal编程技术网

Swift 在这种情况下,我不能推断的类型是什么?

Swift 在这种情况下,我不能推断的类型是什么?,swift,Swift,我有一个协议: protocol Model {} struct Foo: Model {} 和使用此协议的结构: protocol Model {} struct Foo: Model {} 然后我有一个不同的协议和一个通用的: protocol Controller { func fun<T: Model>() -> Observable<T> } 调用Bar().fun()现在将给出错误:无法推断通用参数“Foo” 有两件事我不明白。第一个问

我有一个协议:

protocol Model {}
struct Foo: Model {}
和使用此协议的结构:

protocol Model {}
struct Foo: Model {}
然后我有一个不同的协议和一个通用的:

protocol Controller {
    func fun<T: Model>() -> Observable<T>
}
调用
Bar().fun()
现在将给出错误:
无法推断通用参数“Foo”


有两件事我不明白。第一个问题是,它如何知道我调用了指定Foo的实现,但同时无法推断类型?Foo不是泛型,它是Foo结构的实际类型。我不明白的第二件事,也是这里的实际问题,是如果我在一个实现并指定了泛型方法的实例上调用一个方法,为什么它不能推断出类型

首先,您需要修复
fun
方法的实现:

    func fun<Foo>(_ type: Foo.Type) -> Observable<Foo> {
        return Observable.create { observer in

            let cancel = Disposables.create {
                // clean up
            }

            return cancel
        }
    }
类栏:控制器{
func fun()->可观察{
返回可观察的。在中创建{observer
让cancel=Disposables.create{
//清理
}
退票取消
}
}
}
然后,您需要在调用者中推断泛型
Foo
参数,如:

let observefo:observeable=Bar().fun()

我认为您的误解是将此方法中的
Foo
误认为是
Foo
结构:

func fun<Foo>() -> Observable<Foo> {
    // return an observable
}
调用Bar().fun()时,只需调用一个没有参数的方法。该方法属于Bar,但看不到Foo结构。
func fun<Foo>() -> Observable<Foo> {
    // return an observable
}
protocol Model {}

struct Foo: Model {}

protocol Controller {
    associatedtype ModelType: Model
    func fun() -> Observable<ModelType>
}

class Bar: Controller {
    typealias ModelType = Foo
    func fun() -> Observable<Foo> {
        return Observable.create { observer in

            let cancel = Disposables.create {
                // clean up
            }

            return cancel
        }
    }
}