swift 泛型返回第一个和最后一个元素

标签 swift generics generic-programming anyobject

我正在尝试习惯泛型(从未在 objc 中使用过它们)并想编写一个玩具函数,它接受任何类型的对象 () 并返回第一个和最后一个元素。假设地,我只会在数组或字符串上使用它——我不断收到没有下标成员的错误。我完全理解错误消息告诉我 swift 不知道 T 可能持有一个确实有下标的类型——我只是想知道如何解决这个问题。

func firstAndLastFromCollection<T>(a:T?) {
    var count: Int = 0

    for item in a as! [AnyObject] {
        count++
    }
    if count>1 {
        var first = a?[0]
        var last = a?[count-1]
        return (first, last)
      }
    return something else here
 }

我是否需要在此处的某处进行类型转换(这有点违背此处的目的,因为我需要向下转换为字符串或数组,添加代码并降低此函数的通用性)?

最佳答案

如果您想返回第一个和最后一个元素,那么假设输入参数是某种类型的数组可能是安全的。

所以你可以这样实现你的功能

func firstAndLast<T>(list:[T]) -> (first:T, last:T)? {
    guard let first = list.first, last = list.last else { return nil }
    return (first, last)
}

该函数确实返回一个包含 2 个元素的元组,它们都具有与输入数组的通用元素相同的类型。 返回的元组是一个选项,因为如果数组为空,则返回 nil。

例子

let nums = firstAndLast([1,2,3,4])
let words = firstAndLast(["One", "Two", "Three"])

正如您可以验证的那样,数组中的通用元素类型成为元组中元素的类型。

在上面的示例中,nums 被推断为 (Int, Int)?words (Words, Words)?

更多例子

let emptyList: [String] = []
firstAndLast(emptyList) // nil

扩展

最后,您还可以将此代码编写为 Array 的扩展。

extension Array {
    var firstAndLast: (first:Element, last:Element)? {
        guard let first = self.first, last = self.last else { return nil }
        return (first, last)
    }
}

现在你可以写了

let aCoupleOfShows = ["Breaking Bad", "Better Call Saul", "Mr Robot"].firstAndLast

同样,如果您检查常量 aCoupleOfShows 的类型,您将看到它是一个 (first: String, last: String)?。 Swift 会自动推断出正确的类型。

最后一个例子

在评论中你说你想要字符串的第一个和最后一个字符。如果你使用上面的扩展,这里是代码

if let chars = Array("Hello world".characters).firstAndLast {
    print("First char is \(chars.first), last char is \(chars.last) ")
}

//>> First char is H, last char is d 

关于swift 泛型返回第一个和最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37309278/

相关文章:

swift - dispatch_semaphore_signal 不会调用 PHImageManager requestImageDataForAsset

java - 关于 Java 泛型下限用法 : ? super T

Swift UIText View 替换字符越界

Swift MQTT libmosquitto cleanSession 设置为 false 但无法设置持久订阅

go - golang中参数中的动态结构

java - 使用 Java 参数化类型和多态性实现这种通用编程场景的方法

java - 以通用方式根据值返回对象

java - 如何使用泛型函数参数

swift - 如何以编程方式创建 UIButton

Java泛型/抽象/内部类语法问题