如何在 Swift 中传递“T”类型的“序列”作为参数?

K.W*_*.Wu 1 ios swift

假设我有一个函数,它接受一系列“Person”对象。该序列可以是一个简单的数组,或者 RealmSwift 的 Result,或者 List:

// A simple array
func someFunction(people: [Person]) {

}

// Result
func someFunction(people: Result<Person>) {

}

// List
func someFunction(people: List<Person>) {

}
Run Code Online (Sandbox Code Playgroud)

我不想拥有这 3 个函数,而是只想要 1 个函数,该函数采用“Person”对象的通用序列,如下所示:

func someFunction(people: Sequence<Person>) {

}
Run Code Online (Sandbox Code Playgroud)

这样,我可以将数组、结果或列表传递给函数,而不必担心类型不匹配。但显然这在 Swift 中是不允许的。那我该怎么做呢?

Cha*_*tka 6

编辑: Xcode 14.1 和 Swift 5.7.1 今天发布,通过这些版本,您现在可以通过以下方式执行此操作:

func someFunction(people: some Sequence<Person>) { ... }
Run Code Online (Sandbox Code Playgroud)

原始答案如下。

--

您可以使用 where 子句来完成此操作。在这里阅读有关 where 子句的信息:

https://docs.swift.org/swift-book/LanguageGuide/Generics.html#ID192

要回答您的具体问题,您可以创建一个通用Sequence约束并对其进行约束,Element如下所示:

func someFunction<S: Sequence>(people: S) where S.Element == Person { ... }
Run Code Online (Sandbox Code Playgroud)