说所有擦除类型都不可初始化是否正确?
问题描述:
(通过擦除类型I的意思是:(Any
,AnyHashable
,AnyObject
),或根类别NSObject
)。说所有擦除类型都不可初始化是否正确?
我在问这个问题,因为在下面的代码中我不能初始化something
到AnyObject
。我得到错误:
cannot invoke initializer for type 'AnyObject?' with no arguments
我正在寻找一个适当的工作周围。我不认为正确的选择是初始化在每个语句something
...
func returnObject() -> AnyObject{
var something = AnyObject()
if x == someProperty{
something = y
}
else if x == anotherProperty{
something = z
}else{
something = t
}
return something
}
答
你所期望的初始化怎么办?无论如何,如果您打算立即用y
,z
或t
覆盖something
,那么它有什么关系?
func returnObject() -> AnyObject {
let something: AnyObject
if x == someProperty{
something = y
}
else if x == anotherProperty{
something = z
}
else{
something = t
}
return something
}
然而,它更简洁的使用switch
:
func returnObject() -> AnyObject {
let something: AnyObject
switch x {
case someProperty: something = y
case anotherProperty: something = z
default: something = t
}
return something
}
如果你只是返回something
,你可以内嵌它:
func returnObject() -> AnyObject {
switch x {
case someProperty: return y
case anotherProperty: return z
default: return t
}
}
'VAR的东西:AnyObject ?'或'let something:AnyObject'并确保在任何情况下初始化它。 –
协议无法初始化。因为它们可以是任意数量的类中的一个,它们具有不同的内部属性和函数。你可以从Swift文档中看到NSObject(一个类)和AnyHashable(一个结构)实际上可以被初始化。 – Connor
'AnyHashable'与'Any'或'AnyObject'是非常不同的东西 - 它是一个类型擦除的包装而不是协议。 – Hamish