swift类型推理不适用于函数返回类型吗



swift类型推理不适用于函数返回类型吗?

protocol Vehicle {
func numberOfWheels() -> Int
}
struct Car: Vehicle {
func numberOfWheels() -> Int {
return 4
}
}
struct Bike: Vehicle {
func numberOfWheels() -> Int {
return 2
}
}
struct Truck: Vehicle {
func numberOfWheels() -> Int {
return 8
}
}
struct VehicleFactory {

static func getVehicle<T: Vehicle>(_ vehicleType: T.Type = T.self) -> T? {
let id = identifier(for: T.self)
switch id {
case "Car":
return Car() as? T
case "Bike":
return Bike() as? T
default:
return nil
}
}

private static func identifier(for type: Any.Type) -> String {
String(describing: type)
}
}
let v: Bike = VehicleFactory.getVehicle() // ERROR HERE: Cannot convert value of type 'T?' to specified type 'Bike'
print(v.numberOfWheels())

我在操场上试着做这个。为什么上一行有错误?编译器不应该从let v: Bike声明中推断出类型为Bike吗?

问题是getVehicle返回一个可选的,您必须声明

let v: Bike? = VehicleFactory.getVehicle()

此外,您必须在print行中打开v

不是您问题的直接答案。Vadian已经回答了关于您的实现的一些注意事项:

(_ vehicleType: T.Type = T.self)毫无意义。你可以省略它。

其次,我只需将init((添加到您的协议需求中,去掉标识符方法,将轮子的数量更改为计算属性:

protocol Vehicle {
init()
var numberOfWheels: Int { get }
}
struct Car: Vehicle {
let numberOfWheels = 4
}
struct Bike: Vehicle {
let numberOfWheels = 2
}
struct Truck: Vehicle {
let numberOfWheels = 8
}
struct VehicleFactory {
static func getVehicle<T: Vehicle>() -> T { .init() }
}
let v: Bike = VehicleFactory.getVehicle()
print(v.numberOfWheels)  // "2n"

最新更新