Swift:String 不能为 nil,那为啥 stringByAddingPercentEncodingWithAllowedCharacters 可以为 nil? [复制]

Posted

技术标签:

【中文标题】Swift:String 不能为 nil,那为啥 stringByAddingPercentEncodingWithAllowedCharacters 可以为 nil? [复制]【英文标题】:Swift: String can't be nil, so why can stringByAddingPercentEncodingWithAllowedCharacters be nil? [duplicate]Swift:String 不能为 nil,那为什么 stringByAddingPercentEncodingWithAllowedCharacters 可以为 nil? [复制] 【发布时间】:2015-11-14 12:56:11 【问题描述】:

我对 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不能为nil,所以我不能将nil传递给这个函数,那么它如何返回nil呢?

【问题讨论】:

这是***.com/q/33558933/292145的副本 【参考方案1】:

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

您将返回类型定义为非可选的String。 要么你必须解开结果值以符合类型

func escape(s: String) -> String

  return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!

或将返回类型更改为可选

func escape(s: String) -> String?

  return s.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于Swift:String 不能为 nil,那为啥 stringByAddingPercentEncodingWithAllowedCharacters 可以为 nil? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何理解Swift中Optional的 ! 和 ?

swift中的可选类型

为啥 Swift 隐式展开可选的“nil”?

为啥 AVAudioPlayer var 等于 nil? - 斯威夫特

为啥 Go 中的字符串不能为 nil?

为啥我在我的 Swift 文件中解包 nil?