编辑:我用一个独立的版本替换了我的原始代码存根
我正在使用 Quartz2D 将音乐符号绘制到 CGContext。我正在使用 Swift 4 在 Playground 中执行此操作。
音符由用于符头的单个 CGGlyph 和用于词干的线基元组成。该字形取自音乐字体“bravura”。符头字形的 x 位置正好位于其左边缘。符干必须与该原点完美对齐,因此它的 x 位置必须是符头的 x 位置 + 符干的厚度 / 2。
我有一个函数,它将 CGFloat 作为 x 位置并将字形和词干绘制到 CGContext 中。当 x 的值是像 30.0 这样的四舍五入值时,这非常有效。但是,当该值是一个像 30.9 这样的小数时,词干会错位:
很明显,线条绘制正确,但字形忽略了 CGFloat 的小数部分。当我将 x 值进一步提高到 31.0 时,两个部分再次同步。
这是简化的代码,它将在您的 XCode9 Playground 中工作:
import PlaygroundSupport
import Cocoa
let fontSize = CGFloat(64)
// uncomment the next paragraph if you have added the "Bravura" Font to the ressources folder
/*
let fontURL = Bundle.main.url(forResource: "Bravura", withExtension: "otf")
CTFontManagerRegisterFontsForURL(fontURL! …Run Code Online (Sandbox Code Playgroud) 我有一组Int, CustomType, OtherCustomType. 数组按元组的 Int 部分排序。
为了在正确的位置添加新元素,我编写了一个二分搜索函数来获取插入点索引。
该函数返回一个新的 元组Int, Bool,其中 Bool 表示该元素是否已经存在,而 Int 是新元素第一次出现的索引,或者是大于新元素的第一个元素的索引。
该函数是通用编写的,并采用可比较类型的数组和相同类型的新元素作为参数,因此,显然,我不能简单地传递我的元组数组。
一个简单的解决方案是重新组织我的数据,而不是将三个值作为元组存储在一个数组中,我可以使用三个单独的数组,每个数组只包含三个值中的一个。然后我将只将第一个数组传递给二分搜索函数,然后在找到的索引处对所有三个数组执行所需的操作。
但是有没有办法让我的数据组织成元组,并且只将每个元组的一个元素传递给函数,就像我们能够在比较中忽略元组的一部分一样if tuple == (_ ,23, _)?
下面是一些示例代码:
func findInsertPoint <T: Comparable> (forElement: T, inArray: [T]) -> (Int, Bool) {
var low = 0
var high = inArray.count
if forElement > inArray[high-1] {
return (high, false)
}
while low < high {
let mid = (low+high)/2
if inArray[mid] >= forElement {
high = mid
} else {
low = …Run Code Online (Sandbox Code Playgroud)