2015-05-22 2 views
1

При попытке создать массив ниже, я получаю следующее сообщение об ошибке:Вложенный массив - неоднозначный

type of expression is ambiguous without more context

Является ли массив, такие как это возможно в Swift? Если да, то как оно объявляется?

var jobArray = [ 
    ["Dog Walker", "Job Description", ["Monday", "Wednesday", "Friday"], "7"], 
    ["Babysitter", "Job Description", ["Tuesday", "Wednesday"], "15"], 
    ["Leaves Raker", "Job Description", ["Sunday", ""], "10"] 
] 
+0

Предполагается, что 'пятница' не определена? Какой тип массива вы пытаетесь объявить? – nhgrif

+0

Отредактировано. Все строки – Shades

+0

Ваш код должен работать. Вам нужно указать контекст, в котором вы его используете –

ответ

3

Я предполагаю, что в вашей игровой площадке вы не импортируете Foundation или что-нибудь подобное:

// uncommenting the below line fixes the problem 
// import Foundation 

// with it commented out, 
var jobArray = [ 
    ["Dog Walker", "Job Description", ["Monday", "Wednesday", "Friday"], "7"], 
    ["Babysitter", "Job Description", ["Tuesday", "Wednesday"], "15"], 
    ["Leaves Raker", "Job Description", ["Sunday", ""], "10"] 
] 

Без него вы получите две ошибки:

error: '_' is not convertible to 'StringLiteralConvertible' 
["Dog Walker", "Job Description", ["Monday", "Wednesday", "Friday"], "7"], 
       ^~~~~~~~~~~~~~~~~ 
error: type of expression is ambiguous without more context 

Первый из них гораздо важнее. Второй - артефакт Свифта, который поднимается и идет домой.

Почему? Потому что будет тип [jobArray]? В стандартной библиотеке Swift нет такого типа, который бы соответствовал этому определению - вам понадобится [[Something]], где Something соответствует как StringLiteralConvertible (для "Dog Walker"), так и ArrayLiteralConvertible (для ["Sunday", ""]). И нет никого.

К сожалению, очень грустно ИМХО, такие вещи являются, определенные в пределах Foundation. Именно поэтому он компилируется при добавлении импорта.

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

struct Job { 
    let jobDescription: String 
    let days: [String] // or even an enum for the days of the week 
    let hourlyPay: Double 
} 

var jobArray = [ 
    Job(jobDescription: "Dog Walker", days: ["Monday", "Wednesday", "Friday"], hourlyPay: 7), 
    Job(jobDescription: "Babysitter", days: ["Tuesday", "Wednesday"], hourlyPay: 15), 
    // etc 
] 
+0

Так оно и было. У меня был Фонд там, когда я впервые создал игровую площадку, после чего он был удален в какой-то момент. Большое спасибо – Shades

+0

Как получить доступ к отдельным элементам с помощью структуры в массиве? Например, вместо использования [0] [1] [0], чтобы получить «Понедельник» – Shades

+1

'jobArray [0] .days [0]' –

-1

Предложение дается @AirspeedVelocity очень элегантный способ решить эту проблему, однако если вы хочешь объявить массив, как вы хотите здесь то, что идет не так, вы где объявление дополнительного ненужный массива вокруг ваших данных, объявляя, как показано ниже решает эту проблему:

var jobArray = ["Dog Walker", "Job Description", ["Monday", "Wednesday", "Friday"], "7", 
        "Babysitter", "Job Description", ["Tuesday", "Wednesday"], "15", 
        "Leaves Raker", "Job Description", ["Sunday", ""], "10" 
        ] 

Однако, чтобы сделали код более читаемым и easie г использовать вы можете добавить скобки и превратить его в кортежах:

var jobArray = [ 
     ("Dog Walker", "Job Description", ["Monday", "Wednesday", "Friday"], "7"), 
     ("Babysitter", "Job Description", ["Tuesday", "Wednesday"], "15"), 
     ("Leaves Raker", "Job Description", ["Sunday", ""], "10") 
     ] 

И он используется так:

for (name, description, days, salary) in jobArray 
    { 
    println(name, description, days, salary) 
    } 

Несколько раз заявить, что массив будет выглядеть первой помощи, а также, в этот случай:

var test = [String(),String(),[String](),String()] 

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

+1

Будьте осторожны, в вашем примере с круглыми скобками объекты в массиве на самом деле * кортежи * , Это может сделать его более читаемым для вас, но оно меняет типы в массиве ... – Moritz

+0

@EricD. Хороший момент, я улучшу описание – Icaro

Смежные вопросы