【问题标题】:Converting NSPoint to CGPoint using NSPointToCGPoint使用 NSPointToCGPoint 将 NSPoint 转换为 CGPoint
【发布时间】:2021-04-13 12:53:36
【问题描述】:

从 NSPoint 访问 x 和 y 坐标有多难……不敢相信。

我从以下电话中得到一个 NSPoint:

var mouseLoc = [NSEvent .mouseLocation]

我需要访问 x 和 y 坐标。 NSPoint 不提供像 CGPoint 这样的吸气剂。我了解到:我必须转换为 CGPoint,但我发现的任何东西似乎都无法在最新的 Swift 中使用:

var p = (CGPoint)mouseLoc // error: Cannot convert value of type '[NSPoint]' (aka 'Array<CGPoint>') to expected argument type 'NSPoint' (aka 'CGPoint')

var p = NSPointToCGPoint(mouseLoc) // error: Cannot convert value of type '[NSPoint]' (aka 'Array<CGPoint>') to expected argument type 'NSPoint' (aka 'CGPoint')

我确信这是一个完整的初学者的东西,但我就是不明白。

【问题讨论】:

  • mouseLoc 是一个数组(多个项目),即使它只包含一个。
  • 你正在创建一个 array 的 NSPoints。你想要的是let mouseLoc = NSEvent.mouseLocation
  • [ ... ] 是 Swift 中数组字面量的语法,也许你把它和 Objective-C 消息的语法混在一起了?
  • ... 你永远不会遇到第一个错误,因为这种转换类型的 ObjC 语法 ((CGPoint)mouseLoc) 在 Swift 中是无效的。
  • @RobNapier: 实际上[NSEvent .mouseLocation] 有效的 Swift :)

标签: swift macos cgpoint nspoint


【解决方案1】:

Swift 调用实例或类方法的语法与 Objective-C 不同。

// Objective-C
NSPoint mouseLoc = [NSEvent mouseLocation]

翻译成

// Swift
let mouseLoc = NSEvent.mouseLocation

而您的 Swift 代码会创建一个包含单个 NSPoint数组

另外NSPointCGPoint 的类型别名:

typealias NSPoint = CGPoint

所以您可以简单地使用相同的访问器:

// Swift
let mouseLoc = NSEvent.mouseLocation
let xCoord = mouseLoc.x
let yCoord = mouseLoc.y

【讨论】:

    【解决方案2】:

    这里的 mouseLoc 似乎是一个 NSEvent 数组。遍历它并单独转换每个点或仅使用一个(第一个或最后一个元素)。

    这样迭代:

    let allPoints = mouseLoc.forEach { NSPointToCGPoint($0) }
    

    但在这种情况下,您还将获得一个数组,但现在是 CGPoint。您可能只想使用其中一个,第一个或最后一个。

    但也可能你有一个只有一个元素的数组 - 使用 .first

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-04
      • 2017-07-29
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多