Swift:通用协议(protocol)

标签 swift generics struct swift-extensions swift-protocols

我有一些 swift 结构,它们的协议(protocol)遵从性是通过具有相同方法名称的各个扩展生成的,这些方法名称只是它们依赖于结构的返回类型不同。最重要的是,我想在一个泛型函数中使用它们,该函数为泛型类型调用一个符合协议(protocol)的函数)。 我试图像那样完成这个: //: Playground - 名词:人们可以玩耍的地方

import UIKit

protocol FooProt {
typealias T;
static func createMe<T>()->T;
}


struct FooStruct{

}


extension FooStruct: FooProt{
typealias T = FooStruct;
static func createMe  () -> FooStruct{
    return  FooStruct();
}

}


class Creator{
fun  createOne<T where T:FooProt>(type:T.Type){
   let instance  =  T.createMe();
} 

}

不幸的是,我收到以下错误: /var/folders/sn/78_zvfd15d74dzn01mdv258h0000gq/T/./lldb/3741/playground6.swift:7 :17: 注意:协议(protocol)需要类型为“() -> T”的函数“createMe()”(又名“<τ_1_0>” () -> τ_1_0') 静态函数 createMe()->T;

这里到底有什么不符合规定的,有解决方法吗?

最佳答案

您的代码有几个问题。一方面,您已经定义了一个具有关联类型的协议(protocol)。但是,您将 createMe() 方法定义为使用其他类型的泛型。我不认为那是你的意图。我认为您的意图是拥有一个 createMe() 方法,该方法返回与协议(protocol)关联类型相同的类型。在这种情况下,您需要从 createMe() 方法中删除。此外,名称 createMe() 暗示您不只是返回任何类型,而是返回调用此方法的对象的类型。在这种情况下,您甚至不需要关联的类型协议(protocol)。您只需要一个带有 Self 约束的协议(protocol),它可以让您的代码更简单一些。在您的 Creator 的 createOne 方法中,您的类型约束比需要的更复杂。

我认为您需要以下代码:

protocol FooProt {
    static func createMe()->Self;
}


struct FooStruct{
}


extension FooStruct: FooProt {
    static func createMe() -> FooStruct {
        return FooStruct();
    }
}


class Creator{
    func createOne<T:FooProt>(type: T.Type) -> T {
        return T.createMe()
    }
}


let foo = Creator().createOne(FooStruct.self)

关于Swift:通用协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33806044/

相关文章:

ios - 无法使用 Spotify iOS 应用程序远程 SDK 禁用自动播放

ios - 驱动程序未更新为最新值

c# - 使用 IDictionary 接口(interface)封装字典,而不是覆盖或隐藏方法

Swift:使用泛型使函数通用?

c - 结构中的函数

ios - 无法分配给 ""中的 'self'

C 编程 - 结构、指针和初始化

swift - 如何从通用函数返回值作为协议(protocol)的实现?

ios - Swift 不确定我是否以正确的方式使用 segue

java - Intellij 警告 - 通用未经检查的分配