Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 错误无法调用类型为';盒子<;T>';_Swift_Generics - Fatal编程技术网

Swift 错误无法调用类型为';盒子<;T>';

Swift 错误无法调用类型为';盒子<;T>';,swift,generics,Swift,Generics,为什么这是不允许的 class Box<T>{ let value: T init(_ value:T){ self.value = value } func map<U>( f: T -> U)->Box<U>{ return Box(f(self.value)) } } 类框{ let值:T 初始值(u值:T){ 自我价值=价值 } 函数映射(f:T->U)->框{ 返

为什么这是不允许的

class Box<T>{
    let value: T
    init(_ value:T){
        self.value = value
    }

    func map<U>( f: T -> U)->Box<U>{
        return Box(f(self.value))
    }
}
类框{
let值:T
初始值(u值:T){
自我价值=价值
}
函数映射(f:T->U)->框{
返回框(f(自身值))
}
}
返回框(f(self.value))处出现错误。:

错误:无法使用类型为“(U)”的参数列表调用类型为“Box”的initilizer


您必须指定要返回的
对象的类型:

class Box<T> {
    let value: T
    init(_ value:T){
        self.value = value
    }

    func map<U>(f: (T) -> (U)) -> Box<U> {
        return Box<U>(f(self.value))
    }
}
类框{
let值:T
初始值(u值:T){
自我价值=价值
}
函数映射(f:(T)->(U))->框{
返回框(f(自身值))
}
}

Box
类实现的上下文中,对
Box
的任何引用都假定为
Box
,除非您明确指定类型(就像我在上面的
return
语句中对
Box
所做的那样)。

编译器难道不能从上下文中推断出来吗?–但这里也发生了同样的事情:。是的。我的意思是:这应该被认为是一个编译器错误吗?@MartinR我会说是的,因为
让val:Int=1;让foo=Box(val)
不会给出错误,但解决方法很简单。@MartinR-我可能不想把它称为“bug”。现有的实现有一定的简单性和逻辑性。我可以为这两种方法提供参数。@JeremyP-当然,如果您在
实现之外编写代码,它就可以工作。但是如果您在
实现中执行该代码,您将得到与问题中的代码相同的错误。