【问题标题】:String to NSString briding regarding documentation doesn't work关于文档的字符串到 NSString 的桥接不起作用
【发布时间】:2020-01-08 10:33:13
【问题描述】:

文档问题:

https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html

注意

Swift 的 String 类型与 Foundation 的 NSString 类桥接。 Foundation 还扩展了 String 以公开 NSString 定义的方法。 这意味着,如果你导入 Foundation,你可以访问那些 NSString 不强制转换的 String 方法。

有关在 Foundation 和 Cocoa 中使用 String 的更多信息,请参阅 String 和 NSString 之间的桥接。

问题是它们是什么意思?这个功能应该起作用吗?

import Foundation

class A {
    func doSome() {
        "".isEqual(to: "q")
    }
}

无法编译!

只有这样才有效:

import Foundation

class A {
    func doSome() {
        ("" as? NSString)?.isEqual(to: "q")
    }
}

as?强制转换操作

没有import Foundation NSString 没有定义。

【问题讨论】:

  • 这能回答你的问题吗? Calling NSString method on a String in Swift
  • @nayem 没有答案
  • 实际上,问题上接受的答案的描述指向您要考虑的事情。没有对您的代码进行类型转换的解决方案。
  • @nayem 问题是关于import Foundation 和文档
  • 所以你是说linked question 不可能是重复的,对吧?我认为文档并不完整。 import Foundation 带来了什么问题?

标签: swift


【解决方案1】:

bridge 演员表是 as,不带问号或感叹号。

("" as NSString).isEqual(to: "q")

还有一个可选的桥接演员是

let string : String? = ""
(string as NSString?)?.isEqual(to: "q")

【讨论】:

【解决方案2】:

将字符串转换为 NSString 时,您会收到警告

从 'String' 到 'NSString' 的条件转换总是成功

您无法从字符串中获取方法isEqual(to: "q") 的访问权限,因为这在 String 类中也被覆盖。在覆盖时,它们会删除字符串中的标签to:。所以,你可以像isEqual("q") 这样调用这个方法。这两种方法都是一样的,只有细微的差别。

您可以看到几乎所有其他方法都被覆盖,就像在 String 类中一样。但是对于这种方法,他们只是消失了标签。

【讨论】:

  • isEqual(_: )NSObjectProtocol 的一部分。 isEqual(to: )NSString 的一部分。其他特定 NSString 方法的行为相同。例如,open var doubleValue: Double { get }
  • 没错!如果两个类/协议(NSObjectProtocol 和 NSString)具有相同的方法,那么这件事就会发生。例如hasPrefix 方法在它们中都是可用的,所以当你调用它时,'NSO​​bjectProtocol' 将在字符串的情况下被调用,但'NSString' 将在 NSString 的情况下被调用。如果任何方法仅在一个类中可用,那么它将被调用。例如isProxy() 仅在 NSObjectProtocol 中可用,这意味着只有此方法将在 NSObjectProtocol 内部以任一(NSString,String)方式调用。
【解决方案3】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多