2017-04-20 61 views
3

我刚加入一个有很多现有代码的项目。以前的程序员可能对Swift不熟悉,或者在Swift语言的早期阶段开始开发。他们似乎以奇怪的方式使用了if let声明。他们似乎想要将该陈述用作if is let。在我编辑的代码,我想知道是否有这方面的任何有效使用:Swift:如果是冗余

// In JSON parser 

if value is String, let string = value as? String { 
     document.createdBy = string 
} 

首先检查是否值的类型String似乎是多余的给我。不要在声明的let string = value as? String部分检查这个问题?

问题

为什么会变成这样需要两次检查?或者会有这个原因吗?

+5

你说得对。这只是愚蠢的。不要模仿它。 (顺便说一下,在你的问题中没有“可选链”)。 – matt

+1

我看不到你需要这样做的情况。如果一个变量是一个'String',你不需要用'as'来强制转换它。字符串“,所以如果变量是一个”字符串“,正确的条件是多余的。如果它不是'String'(因此您想要投射它),则左边的条件返回false,因此绝不会出现。 – Paolo

+2

@matt你是对的。我只是不知道在我的标题中还有什么可以称之为重要的。我更新了我的标题。 –

回答

1

你是对的,这是多余的。如果value不是字符串,则value as? String将返回nil,并且条件绑定将失败。

要检查的类型,而不是使用铸造结果:

if value is String { 
    // Do something that doesn't require `value` as a string 
} 

要检查的种类和使用结果:

if let value = value as? String { // The new name can shadow the old name 
     document.createdBy = value 
} 

这样做既没有意义的。