Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.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_Generics - Fatal编程技术网

Swift协议通用函数返回类型

Swift协议通用函数返回类型,swift,generics,Swift,Generics,我想使用通用协议类型作为函数返回类型,如下所示: protocol P { associatedtype T func get() -> T? func set(v: T) } class C<T>: P { private var v: T? func get() -> T? { return v } func set(v: T) { self.v = v } } class Factory { func crea

我想使用通用协议类型作为函数返回类型,如下所示:

protocol P {
  associatedtype T
  func get() -> T?
  func set(v: T)
}

class C<T>: P {
  private var v: T?
  func get() -> T? {
    return v
  }
  func set(v: T) {
    self.v = v
  }
}

class Factory {
  func createC<T>() -> P<T> {
    return C<T>()
  }
}
协议P{
关联T型
func get()->T?
func集(v:T)
}
丙级:P{
私人变量v:T?
func get()->T{
返回v
}
func集(v:T){
自我评价,自我评价
}
}
阶级工厂{
func createC()->P{
返回C()
}
}
但这段代码编译时出现错误:

  • 无法专门化非泛型类型“P”
  • 函数签名中未使用泛型参数“T”

  • 有没有办法用Swift实现类似的功能?

    问题是您不能使用语法
    p
    P
    是一个协议,这意味着它不能被视为泛型类型(
    不能专门化非泛型类型“P”
    ),即使它可能具有给定的
    关联类型

    事实上,由于它有一个
    关联类型
    ,您现在甚至不能直接使用协议类型本身–您只能将其用作通用约束

    解决问题的一个方法是简单地将函数签名更改为
    createC()->C
    ,因为这正是它返回的结果

    class Factory {
        func createC<T>() -> C<T> {
            return C<T>()
        }
    }
    

    类工厂{
    func createC()->AnyP{
    返回AnyP(C())
    }
    }
    
    Swift 5.1支持使用不透明类型返回关联类型。使用不透明类型,代码将成功生成

    协议P{
    关联T型
    func get()->T?
    func集(v:T)
    }
    丙级:P{
    私人变量v:T?
    func get()->T{
    返回v
    }
    func集(v:T){
    自我评价,自我评价
    }
    }
    阶级工厂{
    func createC()->一些P{
    返回C()
    }
    
    哪些行有错误?我想我很清楚#2在哪里,而不是#1。@TroyT使用code
    func createC()->P{
    的行现在有什么变化吗?
    class AnyP<T> : P {
    
        private let _get : () -> T?
        private let _set : (T) -> ()
    
        init<U:P where U.T == T>(_ base:U) {
            _get = base.get
            _set = base.set
        }
    
        func get() -> T? {return _get()}
        func set(v: T) {_set(v)}
    }
    
    class Factory {
        func createC<T>() -> AnyP<T> {
            return AnyP(C<T>())
        }
    }
    
    protocol P {
        associatedtype T
        func get() -> T?
        func set(v: T)
    }
    
    class C<T>: P {
        private var v: T?
    
        func get() -> T? {
            return v
        }
        func set(v: T) {
            self.v = v
        }
    }
    
    class Factory {
        func createC<T>() -> some P {
            return C<T>()
    }