Go言語を初めて学習した時、構造体はどのような時にインタフェースを満たすのか、理解するのに少し苦労しました。しかし、よく読み解いていくと、「あれ、これってSwiftでいうProtocolではないだろうか?」と思いました。というわけで、GoのインターフェースをSwiftベースで置き換えてみようと思います。
完全自分用の学習備忘録として残します。
インターフェース(Go)
type Vehicle interface {
Accelerate()
Brake()
}
type Car struct {
color string
}
func (c Car) Accelerate() {
fmt.Println("車が加速する")
}
func (c Car) Brake() {
fmt.Println("車がブレーキをかける")
}
type Bike struct {
color string
}
func (c Bike) Accelerate() {
fmt.Println("バイクが加速する")
}
func (c Bike) Brake() {
fmt.Println("バイクがブレーキをかける")
}
func drive(vehicle Vehicle) {
vehicle.Accelerate()
vehicle.Brake()
}
func main() {
var car Car = Car{}
drive(car)
var bike Bike = Bike{}
drive(bike)
}
以上のコードをSwiftベースで置き換えてみます。
Swift(Protocol)
import Foundation
// Vehicleプロトコルを定義
protocol Vehicle {
func accelerate()
func brake()
}
// Car構造体を定義し、Vehicleプロトコルに準拠
struct Car: Vehicle {
var color: String
func accelerate() {
print("車が加速する")
}
func brake() {
print("車がブレーキをかける")
}
}
// Bike構造体を定義し、Vehicleプロトコルに準拠
struct Bike: Vehicle {
var color: String
func accelerate() {
print("バイクが加速する")
}
func brake() {
print("バイクがブレーキをかける")
}
}
func drive(vehicle: Vehicle) {
vehicle.accelerate()
vehicle.brake()
}
let car = Car(color: "Red")
drive(vehicle: car)
let bike = Bike(color: "Blue")
drive(vehicle: bike)