Массив из Tuples


#1

Добрый вечер.

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

Если я добавляю в Массив Tuples таким способом:

let jan = (name: "January", days: 31)
let feb = (name: "February", days: 28)
let mar = (name: "March", days: 31)

let month = [jan, feb, mar,]

То при печати содержимого массива

print("\(month[0])")

В консоли я увижу:

(name: "January", days: 31)

Если же я создам массив и добавлю в него элементы таким образом:

let month2 = [(name: "January", days: 31),
              (name: "February", days: 28),
              (name: "March", days: 31)
             ]

То при печати содержимого массива

print("\(month2[0])")

В консоли я увижу:

("January", 31)

То есть name и days пропадают. Не могли бы вы пояснить, почему так происходит?

Заранее большое спасибо.


#2

Не может быть


#3

Решил перепроверить, нашел ошибку. Пока экспериментировал, в одной строке убрал name и days:

let month2 = [(name: "January", days: 31),
              (name: "February", days: 28),
              (name: "March", days: 31),
              ("April", 31) // Решил проверить, будет ли ошибка при запуске 
                            // программы. Ошибки не возникло, но name и days 
                            // пропали для всех Tuples в массиве. 
              ]

Спасибо за ответ!


#4

Можно сразу указать тип:

let month2: [(name: String, days: Int)] = [
    ("January", 31),
    ("February", 28),
    ("March", 31),
    ("April", 31)
]

print(month2[0]) // (name: "January", days: 31)

#5

Во блин, так еще короче получается, спасибо! Буду править свои “проги”)


#6

Картинка Морихея Уэсиба Помни, кортежи - не панацея! :point_up:


#7

Так почти структуры, структуры тоже не панацея?

struct User {
    let name: String
    let age: Int
}

typealias User2 = (
    name: String,
    age: Int
)

let user2 = User2("Vasa", 100)

let user = unsafeBitCast(user2, to: User.self)

print(user)


#8

Структурами тоже злоупотреблять нельзя. Даже несмотря на то что эппл их продвигает %)


#9

С чего вдруг?



#10

Так вроде же почти всё, что есть в Swift - это структуры и вы ими и так “злоупотребляете”, используя банальные String, Int и прочее…???


#11

Ну например, читаешь ты такой, что структуры потокозащищены. И пишешь свою структуру в с методами изменения полей. А потом в одно из полей прокрадывается класс. И твоя потокозащищенность коту под хвост.

С памятью примерно тоже самое. Вроде структуры в стеке лежат. Но опять же, подмешаешь класс и она уже в куче.

Я конечно могу ошибаться, тогда поправьте меня, я статьи перечитаю и более тщательно переведу.


#12

Это простые типы. К ним вопросов никаких. Говорим про самописные. :thinking:


#13

Не понятен совершенно аргумент, как и выше.
У тех же типов есть и методы и параметры в бОльшем количестве, чем большинство самописных. Объектов своих структур тоже в разы меньше, чем «подкапотных»… И вы же не паритесь по этому поводу. Где логика???


#14

Вы ссылки давайте, вместе перечитаем :slight_smile:


#15

#16

Ок. Непонятен и ладно. Снимаю все свои вопросы и забираю слова обратно. :point_up:


#17

Так я понять хочу аргументацию!
Мы же в огромном количестве используем структуры по-умолчанию. Почему должно напрягать мизерное количество самописных? Ведь разницы нет - и то и то структуры и их экземпляры. А пропорция 1/99 самописных к дефолтным…Почему нас должен волновать 1% того же, что есть уже в 99% и от этих 99% никто не собирается отказываться?


#18

Тебе аргументацию я объяснить не смогу. Поэтому см. коммент выше. Снимаем вопрос и живем как будто этой беседы не было.


#19

Сначала описывается какие прекрасные структуры, а потом бах, если структура содержит ссылочный тип то всё плохо, классы продолжают вести себя как классы, например так:

class Car {
    var name: String
    init(name: String) { self.name = name }
}

struct User {
    var name: String
    var car: Car
}

let user = User(name: "A", car: Car(name: "A"))
var user2 = user

user2.name = "B"
user2.car.name = "B"

print("user: \(user.name) user car: \(user.car.name)") // user: A user car: B
print("user: \(user2.name) user car: \(user2.car.name)") // user: B user car: B

Внезапно :thinking:


#20

Получается, что если мы перегружаем какой-нибудь оператор или расширяем тип для работы с классами, то всё плохо и этого делать не стоит? Проблема в копировании ссылок на классы (на одно место)?