Swift:String不能为nil,那么为什么stringByAddingPercentEncodingWithAllowedCharacters可以为nil?

时间:2015-11-14 12:56:12

标签: string swift

我对Swift相对较新,我一直在围绕可选变量。这是我遇到的问题:

func escape(s: String) -> String
{
    if s == nil
    {
        return ""
    }

    return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
}

编译器抱怨说:

Value of type 'String' can never be nil, comparison isn't allowed

这是参考if s == nil行。如果我删除if语句行并且只有返回值行,我会收到错误:

Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'

我在文档中看到stringByAddingPercentEncodingWithAllowedCharacters返回一个String?参数。我不明白为什么这不是一个字符串?由于String不能为nil,我不能将nil传递给这个函数,那么它将如何返回nil?

2 个答案:

答案 0 :(得分:2)

  • 您将参数s定义为非可选String。 非可选类型永远不能为零,这就是编译器抱怨的原因 只需删除对nil

  • 的检查
  • 您将返回类型定义为非可选String 要么必须打开结果值以符合类型

    func escape(s: String) -> String
    {
      return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
    }
    

    或将返回类型更改为可选

    func escape(s: String) -> String?
    {
      return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
    }
    

答案 1 :(得分:1)

发布后不一分钟,我更深入地阅读了文档。 stringByAddingPercentEncodingWithAllowedCharacters即使给定非零值,也可以返回nil值。来自https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/#//apple_ref/occ/instm/NSString/stringByAddingPercentEncodingWithAllowedCharacters

  

返回值返回编码的字符串,如果转换则返回nil   是不可能的。

     

讨论UTF-8编码用于确定正确的百分比   编码字符。整个URL字符串不能进行百分比编码。