Open4

Swift 書いててわからないこと

yukiyuki

誰か教えて下さい 🙏
あとで Stack Overflow とかに投げるかも。

yukiyuki

下記のように、可変長引数を受け取って自動でリストを生成するイニシャライザを実装しようとしている。

enum List<T: Equatable> {
    indirect case cons(head: T, tail: List<T>)
    case `nil`
}

extension List {
    init<T>(source: T...) {
        if source.isEmpty {
            self = .`nil`
        } else {
            self = .cons(head: source[0], tail: source[1..<source.count])
        }
    }
}

// 使い方
// List(1, 2, 3, 4)
// ↑のように書くと、List.cons(1, List.cons(2, List.cons(3, List.cons(4, List.`nil`)))) と生成される想定

このイニシャライザの実装時に、下記画像のようなコンパイルエラーになってしまう。型注釈が必要なのかもしれないが、どこに注釈を入れればよいのかよくわからない。

小清水 健人小清水 健人

こんな感じでいかがでしょうか?

extension List {
    init(_ source: T...) {
        self.init(source: source)
    }

    private init<S>(source: S) where S: RandomAccessCollection, S.Element == T {
        if source.isEmpty {
            self = .nil
        } else {
            self = .cons(
                head: source.first!,
                tail: List(source: source.dropFirst())
            )
        }
    }
}
yukiyuki

わ、ありがとうございます!ちょっと試してみます。firstdropFirst という関数があるんですね。便利です。