Помощь по синтаксису в Swift. Помогите разобраться


#1

Добрый день. Решаю задачу на Swift. Заключается в объявлении перечисления в которые помещены шахматные фигуры и ассоциированные параметры к ним. К ассоциированным параметрам установлены связанные значения. С помощью оператора switch нужно проанализировать переменную с одной фигурой и вывести ассоциированные и связанные значения.
Код получился следующий:
enum Chessmen {

// вложенное перечисление с вариантами цветов фигур и связанные значения к ним

enum figureColor: String {

case Black = “Черный”

case White = “Белый”

}

//перечислены фигуры и ассоциированные параметры.

case korol (rusname: String, color: figureColor)

case koroleva (rusname: String, color: figureColor)

case tura (rusname: String, color: figureColor)

case kon (rusname: String, color: figureColor)

case ladya (rusname: String, color: figureColor)

}

//создаем переменную содержащую фигуру

var chessfigure = Chessmen.korol (rusname: “Король”, color: .Black)

switch chessfigure {

case .korol (rusname: “Король”, color: .Black):

print ("(.korol(rusname: “Король”, color: .Black)")

default :

print (“Другая фигура”)

}

В строке
print ("(.korol(rusname: “Король”, color: .Black)")
нужно, к ассоциированному значению color чтобы на консоль выходило связанное значение на русском “Черный”, которое указано во вложенном перечислении.
Не могу разобраться с синтаксисом, как этого добиться. Помогите пожалуйста разобраться.


#2
var chessfigure = Chessmen.korol (rusname: "Король", color: .Black)
switch chessfigure {
case .korol(let name, let color):
    print(color.rawValue)
default:
    print ("Другая фигура")
}

#3

Да, это мне помогло,
спасибо, Сергей
я правильно понимаю, что мне приходится определить две константы внутри оператора, так как отсюда тут я нет прямого доступа к элементам перечисления и приходится обратиться к их значениям?


#4

Добрый день. Есть следующая задача, решением которой является следующий код:
//создаем перечисление для объявления перечня цветов шахматных фигур
enum Color {
case Black
case White
}
//Создаем перечисление для объявления типов фигур
enum ChessFigures {
case Korol (rusname: String, color: Color)
case Koroleva (rusname: String, color: Color)
case Slon (rusname: String, color: Color)
}
//создаем структуру, которая будет содержать свойства: тип фигуры, цвет фигуры, координаты. Свойство координаты имеет значение по умолчанию. Требуется создать инициализатор который будет принимать значения свойств тип и цвет. Далее нужно будет создать переменную которая объявляет фигуру принимающую в качестве входных данных цвет и тип.
Как правильный синтаксис, чтобы объявить такую переменную?

struct Chessmen {
let type: ChessFigures
let nameColor: Color
let figureCoordinates: (String, UInt)?
init (type: ChessFigures, nameColor: Color){
self .type = type
self .nameColor = nameColor
}
}
\Создаем переменную содержащую фигуру и ее описание . Не могу подобрать верный синтаксис, как передать свойства в эту фигуру?
var figure = Chessmen (type: ChessFigures, nameColor: Color)
// для этого варианта объявления переменной выходит следующая ошибка:
Cannot convert value of type ‘ChessFigures.Type’ to expected argument type ‘ChessFigures’


#5

Вам не обязательно писать инициализатор, поскольку в структуре он создается автоматом. И здесь же рекомендуется по умолчанию использовать var.

Основная проблема у вас во втором енуме ChessFigures. Здесь явно напрашивается структура со свойствами name, rusname и color.

struct ChessFigures {
    var name: String
    var rusname: String
    var color: Color
}

а потому уже на основании этой структуры делать перечисление, поскольку ChessFigures - это объект с разными свойствами, а енум - это объект с перечислениями разных вариантов одного свойства, в данном случае названий фигур.

enum Color {
    case Black
    case White
}

struct ChessFigures {
    var name: String
    var rusname: String
    var color: Color
}

enum ChessType {
    case king(ChessFigures)
    case queen(ChessFigures)
}

struct Chessmen {
    var type: ChessType
    var nameColor: Color
    var figureCoordinates: (String, UInt)?

}

var figure = Chessmen(type: ChessType, nameColor: Color, figureCoordinates: (String, UInt)?)

#6

Максим, спасибо за ответ.

  1. По поводу того, что лучше было бы вместо перечисления делать структуру: задание учебника стояло именно так, что нужно было сделать и перечисления и структуру. Ниже фото страницы учебника. Задание выделено в отдельный блок.

#7
  1. Тем не менее я попробовал воспользоваться кодом предложенным в ответе, возникла та же самая ошибка. Скриншот ниже:
    Где то какая то не увязка при объявлении переменной, жалуется что тип в структуре и тип значений в переменной не совпадает. Вот и не могу разобраться как верно объявить переменную передав в нее свойства.
    В чем может быть ошибка?

#8

попробуйте перезапустить плэйграунд, у меня этой ошибки уже нет

И второй момент, что здесь вы уже создаете экземпляр типа, поэтому в параметрах вместо типов уже должны быть значения. Которые в свою очередь должны быть в первичных структурах.


#9

и еще, в варианте без дополнительной структуры возможно проблема в первом енуме с цветами. Почему у вас названия кейсов здесь с большой буквы?

Также возможно, что это задание связано с предыдущим, поскольку в книге перед ним создаются две переменные одной и той же структуры, которая объявлена ранее.


#10

Максим,
попробовал перезапустить, без указания конкретных значений была та же самая ошибка.
Попробовал подставить значения, вообще все рухнуло )


#11

здесь нужен немного другой синтаксис


#12

Максим
ошибки в енуме исправил. Посмотрел в учебнике, нужно действительно писать с маленькой буквы. Но почему то в ответах к заданиям пишут с большой ). Но это не помогло. Что касается переменных, это не связанные с заданием переменные. Это просто пример для того, чтобы разобрать теорию. Предыдущее задание было - создать связанные значения в Color c помощью switch case. В начале это темы писал вопросы по этому поводу.


#13

ну вот смотрите, у меня создался экземпляр без ошибок. Если у вас ошибки все равно выскакивают, то возможно надо перезагрузиться. Или попробуйте запускать плэйграунд в ручном режиме


#14

что-то мы тут с вами намудрили, вот ваш исходный код, там все работает

enum Color {
    case black
    case white
}

enum ChessFigures {
    case korol (rusname: String, color: Color)
    case koroleva (rusname: String, color: Color)
    case slon (rusname: String, color: Color)
}

struct Chessmen {
    let type: ChessFigures
    let nameColor: Color
    let figureCoordinates: (String, UInt)?
}

var figure = Chessmen(type: .korol(rusname: "Korol", color: .black), nameColor: .black, figureCoordinates: ("F", 5))

#15

у вас просто в первом случае были не заполнены плэйсхолдеры, а во втором вы не так их заполняли.

Ну и еще чисто по логике у вас почему-то цвет указывается два раза.


#16

Здравствуйте, а что это за учебник, можете подсказать?


#17

Здравствуйте, да конечно. Книга Василия Усова - Swift Основы разработки приложений под IOS и МасOS - 4 издание, дополненное и переработанное 2019


Еще можете ознакомится с их порталом посвященному Swift - swiftme.ru


#18

Дополню, но лично мне очень понравилось наполнение ресурса Swiftboоk.ru. Swiftme - больше описательный. Каждому блоку есть описательная часть ( но есть и дон задания), а тут более практическая. Сравнение объектов, различия, рекомендации + курсы тесты. В общем оба ресурса хороши в связке.


#19

Максим, приветствую.

  1. Ваши варианты объявления переменных работают безошибочно. Только что т оне могу структурировать в голове разницу между ними. Я так понимаю это два разных варианта объявления переменных? При этом они совпадают в первом входном параметре "king, но дальше в первом варианте мы указываем связанное значение и цвет, во втором цвет и координаты. И еще это два разных хранилища. В чем логика и почему мы не можем все это поместить в одно хранилище переменной?
  2. Далее вы пишите, что мы намудрили, и предлагаете исходный код. Он действительно работает если скопировать из вашего варианта. Но сложность в том, что в задании есть пункт создать инициализатор. Вот если в этот код вставить инициализатор, то все рушится. В этом и была моя цель, понять как должен изменится синтаксис при объявлении переменных при объявлении инициализаторов.

Сможем разобраться?))


#20

Разве? Одну ошибку я вам уже показал - неправильное заполнение плэйсхолдеров при создании переменной. Вторая связана с инициализатором, где должно быть три свойства.