当前位置: 首页 > 面试题库 >

创建一个CountableClosedRange

岳华灿
2023-03-14
问题内容

我试图扩展Character到符合Strideable以创建CountableClosedRangeCharacter类型。最后,我希望有这样的东西可以打印整个字母:

("A"..."Z").forEach{
    print($0)
}

目前,我正在使用UnicodeScalar类型来计算两个字符之间的距离。因为Character类型无法使用标量,所以我需要根据Character创建一个String,获取第一个标量的值,然后计算它们之间的距离:

extension Character: Strideable {

    func distance(to other: Character) -> Character.Stride {
        return abs(String(self).unicodeScalars.first?.value - String(other).unicodeScalars.first!.value)
    }

    func advanced(by n: Character.Stride) -> Character {
        return Character(UnicodeScalar(String(self).unicodeScalars.first!.value + n))
    }

}

即使这样,我Character仍然得到不符合协议Strideable和的错误_Strideable。编译器似乎没有选择Stride随附的关联类型Strideable

public protocol Strideable : Comparable {

    /// A type that can represent the distance between two values of `Self`.
    associatedtype Stride : SignedNumber

    // ...

}

我想念什么?


问题答案:

如前所述,由于a
Character可以由多个unicode标量组成,因此您无法准确确定两个任意字符之间有多少个不同的有效字符表示形式,因此不是符合的理想选择Stridable

一种方法是你的只是想打印出字母表问题是顺应UnicodeScalar,而不是CharacterStridable-让你与由单一的Unicode代码点表示的字符工作,并推动它们基于代码点。

extension UnicodeScalar : Strideable {

    public func distance(to other: UnicodeScalar) -> Int {
        return Int(other.value) - Int(self.value)
    }

    /// Returns a UnicodeScalar where the value is advanced by n.
    ///
    /// - precondition: self.value + n represents a valid unicode scalar.
    ///
    public func advanced(by n: Int) -> UnicodeScalar {
        let advancedValue = n + Int(self.value)
        guard let advancedScalar = UnicodeScalar(advancedValue) else {
            fatalError("\(String(advancedValue, radix: 16)) does not represent a valid unicode scalar value.")
        }
        return advancedScalar
    }
}

现在,您可以形成一个CountableClosedRange<UnicodeScalar>,并且可以将每个元素自由转换为Character或,String如果需要的话:

("A"..."Z").forEach {

    // You can freely convert scalar to a Character or String
    print($0, Character($0), String($0))
}

// Convert CountableClosedRange<UnicodeScalar> to [Character]
let alphabetCharacters = ("A"..."Z").map {Character($0)}


 类似资料:
  • 如你所知,Android使用SQLite作为它的数据库管理系统。SQLite是一个嵌入app的一个数据库,它的确是非常轻量的。这就是为什么这是手机app的不错的选择。 尽管如此,它的操作数据库的API在Android中是非常原生的。你将会需要编写很多SQL语句和你的对象与ContentValues或者Cursors之间的解析过程。很感激的,联合使用Kotlin和Anko,我们可以大量简化这些。 当

  • A package is a directory with some code and a package.json file that provides information to Yarn about your package. Most packages use some kind of version control system. The most common one is git

  • 以下步骤假设您已经了解了 Node.js 和 npm 的基本知识。如果对它们不熟悉,可以访问 https://docs.npmjs.com/ 来了解更多关于 npm 的用法。 Weex 提供了一个命令行工具 weex-cli 来帮助开发者使用 Weex。它可以用来快速创建一个空项目、初始化 iOS 和 Android 开发环境、调试、安装插件等操作。 目前 weex-cli 只支持创建 Vue.j

  • 如果我只是想在Netty应用程序中不使用ByteBuf。我使用创建一个ByteBuf,那么我必须在函数末尾调用吗?

  • 我正在使用GeoTools Java库进行一些几何计算。在我的例子中,我使用的是一个形状文件,其中包含某个城市的所有邻域多边形。我想知道在那个城市的每一个可能的坐标,它对应于哪个社区。因此,我的方法是简单地在邻近的多边形上循环,并检查给定点是否在其中。下面是所提到的代码的一部分: 对如何摆脱这个问题有什么建议吗?

  • 这个指引会带搭建一个简单的『Hello』程序。当然这只是开始,迈出这一步你将感受到 Blade 的强大