Open4
Swift 書いててわからないこと
誰か教えて下さい 🙏
あとで Stack Overflow とかに投げるかも。
下記のように、可変長引数を受け取って自動でリストを生成するイニシャライザを実装しようとしている。
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())
)
}
}
}
わ、ありがとうございます!ちょっと試してみます。first
と dropFirst
という関数があるんですね。便利です。