Я не совсем уверен, что вы пытаетесь сделать с SingUpError
(вы имеете в виду SignUpError
?), но это моя попытка. В основном я перемещаю перечисление из func, и я делаю func возвратом String
class SingUpError {
enum ErrorMessage: String {
case noName = "Name cannot be empty"
case noLastName = "Last name cannot be empty"
case noEmail = "Email cannot be empty"
case noPassword = "Password cannot be empty"
}
func errorMessage(name: String?, lastName: String?,email: String?, password: String?) -> String? {
var message: String?
if name == nil || name.isEmpty {
message = ErrorMessage.noName.rawValue
} //else if lastName...
return message
}
}
, а затем в submitData
if let error = vm.errorMessage(name: name, lastName: lastName, email: email, password: password) {
nameErrLbl.text = error
}
Это происходит потому, что ваш snake
является массивом объектов. Вам нужно либо превратить это в один объект, чтобы ваш код работал, либо использовать индекс для выбора объекта внутри.
ctx.fillRect(snake[0].x-unit/2, snake[0].y-unit/2, unit, unit);
Также обратите внимание, что для правильного центрирования вашей змеи вам необходимо вычесть unit/2
из координат x
и y
.
Вы также можете удалить настройку размеров холста в вашем коде, так как она устанавливается, когда вы определяете атрибуты height
и width
для вашего элемента canvas
.
См. Рабочий пример ниже:
//declare global variables
const canvas = document.querySelector('#canvas');
//set canvas context
const ctx = canvas.getContext('2d');
//put canvas dimensions into variables
const cvsW = canvas.width;
const cvsH = canvas.height;
//create snake unit
const unit = 16;
//create snake and set starting position
let snake = [{
x: cvsW / 2,
y: cvsH / 2
}];
ctx.fillStyle = 'lime';
ctx.fillRect(snake[0].x - unit / 2, snake[0].y - unit / 2, unit, unit);
body {
background-color: #333;
}
#canvas {
background-color: #4d4d4d;
display: block;
margin: auto;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
}
<canvas id="canvas" width="768" height="512"></canvas>