说所有擦除类型都不可初始化是否正确?

问题描述:

(通过擦除类型I的意思是:(Any,AnyHashableAnyObject),或根类别NSObject)。说所有擦除类型都不可初始化是否正确?

我在问这个问题,因为在下面的代码中我不能初始化somethingAnyObject。我得到错误:

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 

} 
+0

'VAR的东西:AnyObject ?'或'let something:AnyObject'并确保在任何情况下初始化它。 –

+1

协议无法初始化。因为它们可以是任意数量的类中的一个,它们具有不同的内部属性和函数。你可以从Swift文档中看到NSObject(一个类)和AnyHashable(一个结构)实际上可以被初始化。 – Connor

+1

'AnyHashable'与'Any'或'AnyObject'是非常不同的东西 - 它是一个类型擦除的包装而不是协议。 – Hamish

你所期望的初始化怎么办?无论如何,如果您打算立即用y,zt覆盖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 
    } 
} 
+0

多数民众赞成你错了你初始化的东西作为可选 –

+0

@LeoDabus固定 – Alexander

+0

东西永远不会改变你为什么不使用让? –