В настоящее время я работаю над игрой SpriteKit, написанной на Swift 3.
Когда я пытался сгенерировать SKShapeNodes из точек, хранящихся в многомерном массиве, с помощью init (splinePoints: UnsafeMutablePointer, count: Int) инициализатор, я обнаружил, что просто не удалось использовать функцию неявного моста Swift, а именно путем добавления «&» перед рассматриваемой переменной, чтобы передать ее функции как UnsafeMutablePointer.
Вот изображение воспроизведения ошибки, включая ошибку, в Xcode Playgrounds:
Ошибка гласит
Невозможно преобразовать значение типа «[CGPoint]» в ожидаемый тип аргумента «CGPoint»
, хотя ссылка на инициализатор явно указывает, что ему нужен указатель на массив CGPoint. Даже в разделе пример, приведенный Apple
Создание узлов формы из точек, это делается именно так:
var points = [CGPoint(x: 0, y: 0),
CGPoint(x: 100, y: 100),
CGPoint(x: 200, y: -50),
CGPoint(x: 300, y: 30),
CGPoint(x: 400, y: 20)]
let linearShapeNode = SKShapeNode(points: &points,
count: points.count)
let splineShapeNode = SKShapeNode(splinePoints: &points,
count: points.count)
Итак, мой вопрос: почему он не работает, является ли это ошибкой компилятора, а если нет, то как я могу ее исправить.
Обратите внимание, однако, что создание копии массива внутри функции, как это ...
func createPressurePointShape(arm: Int, finger: Int) {
var tempPoints = pointsArray[arm][finger]
let shapeNode = SKShapeNode.init(splinePoints: &tempPoints, count: pointsArray[arm][finger].count)
}
... не является решением для меня, потому что в моем реальном приложении переменная будет существовать только для 1 кадра и либо исчезнет, либо впоследствии создаст утечку памяти. Просто тот факт, что это позволяет устранить ошибку, хотя и намекает на ошибку в Swift или Xcode, а не в моем приложении, но я не уверен в этом.
Заранее благодарю за вашу помощь. Вот пример кода, если кто-то захочет поиграть с ним:
//: Playground - noun: a place where people can play
import UIKit
import SpriteKit
let armCount = 4
let fingersPerArm = 4
let pressurePointsPerFinger = 3
private var pointsArray = [[[CGPoint]]](repeating: [], count: Int(armCount))
for armIndex in 0...Int(armCount - 1) {
for fingerIndex in 0...(fingersPerArm - 1) {
pointsArray[armIndex].append([])
for innerIndex in 0..<pressurePointsPerFinger {
pointsArray[armIndex][fingerIndex].append(CGPoint(x: 0.5, y: 0.5))
}
}
}
let exampleArm = 1
let exampleFinger = 1
func createPressurePointShape(arm: Int, finger: Int) {
let shapeNode = SKShapeNode.init(splinePoints: &pointsArray[arm][finger], count: pointsArray[arm][finger].count)
}
createPressurePointShape(arm: exampleArm, finger: exampleFinger)