Возврат / передача нового массива в функцию (Swift 5)

#arrays #swift

#массивы #swift

Вопрос:

Например, в Java вы можете сделать что-то вроде этого:

 myFunction(new MyClass[]{myclass1, myclass2, myclass3})
  

Есть ли эквивалент в Swift?

Я пытался

 myFunction([MyClass](myclass1,myclass2,myclass3))
  

и Xcode предложил изменить его на

 myFunction([MyClass](arrayLiteral: myclass1,myclass2,myclass3))
  

но документальный фильм (щелчок) говорит вам не вызывать «arrayLiteral» напрямую.

Редактировать: причина, по которой я хочу это сделать, немного сложна:

Я получил класс MyClass и создал кучу экземпляров, которые несут данные: myclass1, myclass2, myclass3

 init(name na:String, number nu:Int, content c:String) {....}
  

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

 init(name n:String, someotherinfo s:String, myclassarray m:[MyClass]) {....}
  

Создание экземпляра:

 var myotherclassthing = MyOtherClass(name:"Test", someotherinfo:"Bla", myclassarray: ??????????)
  

Затем MyOtherClass я перехожу из своего основного представления во второе представление через переход.

Комментарии:

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

2. @nayem Не уверен, как работает сборщик мусора в Swift, но скорее я не хочу создавать новый var , который я никогда не буду использовать. Наверное, я просто привык передавать новый массив напрямую. Есть ли тогда разница между созданием нового var и созданием и передачей массива непосредственно в Swift?

3. Вы задавали эти два вопроса, верно? 1. создание нового var , 2. создание и передача массива напрямую. И вы хотите знать, есть ли какая-либо разница между ними или нет. Если я правильно понимаю ваш вопрос, то нет, разницы нет . По сути, когда вы передаете массив другому методу, фактически передается совершенно новый экземпляр.

4. Ну, вы слишком много думаете об этом. Существуют фундаментальные различия между Java и Swift . Java видит любой объект как ссылку, но Swift не всегда. Вам нужно изучить различия между value amp; reference more в Swift. Swift разработан value с учетом типов. В Swift вы видите много struct «s».

5. Теперь, если вы просто хотите узнать ответ на свой вопрос, вот он: myFunction([myclass1, myclass2, myclass3]) . Вы заключаете в скобки кучу объектов, используя [ ] , вы создаете экземпляр Array . Вот и все.

Ответ №1:

Это должно сработать

 myFunction(["a","b","c"])
  

Это работает одинаково хорошо, если вы хотите вернуть массив из функции

 func test() -> [String] {
    return ["a", "b"]
}
  

И он одинаково хорошо работает с пользовательским классом

 MyOtherClass(name:"Test", someotherinfo:"Bla", 
             myclassarray: [MyClass(name: "A", number: 1, content: "AAA"), 
                            MyClass(name: "B", number: 2, content: "BBB")])
  

Комментарии:

1. Я тоже пробовал это, но это не работает (тип «myclass», я просто использовал String, чтобы его было легче увидеть). Вместо этого он говорит: Cannot convert value of type ‚(String, String, String)‘ to expected element type ‚String‘ .

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

3. Нет кортежей. Я собираюсь немного отредактировать свой вопрос, надеюсь, тогда он станет немного понятнее: у меня есть класс MyClass , и я создал кучу экземпляров, которые несут данные. Эти экземпляры я хочу добавить в массив, который затем использую для создания экземпляра второго класса ( MyOtherClass включая некоторые строки), который, в свою очередь, я передаю из моего основного представления во второе представление через переход.

4. Спасибо. Должно быть, у меня там были какие-то другие скобки, которые Xcode не распознал как виновника, с [myclass1, myclass2, myclass3] это работает.