2014-12-24 3 views
8

Im изучения Swift и получил запутанной следующий синтаксис:Синтаксис Объяснение: квадратные скобки в Swift

var treasures: [Treasure] = [] 

сокровище пользовательский класс, объявленный следующим образом:

class Treasure: NSObject { 
... 

В Obj-C квадратные скобки означают но что это значит:

var treasures: [Treasure] = [] 

Может ли кто-нибудь дать объяснение? Благодаря!

+3

это массив. строка var treasures: [Treasure] = [] объявляет массив, называемый сокровищами, которые должны удерживать объекты класса Treasure и инициализировать его пустым массивом –

ответ

13

Ok, это значение

var treasures: [Treasure] = [] 
  • вар: вы объявляете переменную
  • сокровища: имя вашей переменной
  • [Сокровище]: тип переменной, в этом случае это тип Array of Treasure, компилятор позволит вам вставить только объект типа Treasure в ваш массив
  • []: фактический объект (массив), на который ссылается ваша переменная, в данном случае пустой массив.

E.g. если вы хотите, чтобы массив держал 2 элемента, вы можете написать

var treasures: [Treasure] = [Treasure(), Treasure()] 

Надеюсь, это поможет.

Update: Мой пример можно также записать этот путь

var treasures = [Treasure(), Treasure()] 

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

+1

Спасибо, мне нравится это объяснение, скажите, пожалуйста, компилятор запретит мне вставлять любые другие типы в массив (а не клад)? Как объявить «простой» NSMutableArray без ограничений типа? –

+1

Добро пожаловать. Вы можете создать массив «AnyObject». Это протокол, к которому все классы неявно соответствуют. Это позволяет вам написать что-то вроде этого *** var things: [AnyObject] = ["Hello world", 1, Treasure()] *** –

+0

О *** mutable *** Array обратите внимание, что вы создаете изменяемый массив, если вы объявите его с помощью ключевого слова *** var *** (как и вы). Вместо этого вы объявляете неизменяемый массив, вы используете ключевое слово *** let ***. –

12

[Treasure]всего лишь синтаксис сахара для Array<Treasure>.

Точно так же [String:Treasure] является просто синтаксическим сахаром для Dictionary<String,Treasure>.

[]- всего лишь пустой массив определенного вами типа. Точно так же [:] - это пустой словарь.

Когда дело доходит до Swift и квадратных скобок, правила просты. Они используются только в двух ситуациях:

1) работе с массивами и словарем типов:

let vectors : [[Int]] = [[1,2,3],[4,5,6]] 
let birthBook : [Int:[String]] = [1987:["John","William"], 1990: ["Mary"]] 

2) для индексирования объекты, которые поддерживают индексирование:

class RouteMapper { 

    private var routeMap : [String:String] = [:] 

    subscript(endpoint: String) -> String { 
     get { 
      if let route = routeMap[endpoint] { 
       return route 
      } 
      return "/" 
     } 
     set(newValue) { 
      routeMap[endpoint] = newValue 
     } 
    } 
} 

let routeMapper = RouteMapper() 
routeMapper["users"] = "/v1/confirmed/users" 
let url = routeMapper["admins"] 

С [ и ] не разрешены в пользовательских операциях, это единственные способы использования.

+0

Довольно ясно теперь для меня, спасибо siejkowski! –

+0

Я нашел этот ответ, пытаясь понять, как работает XCTAssertEqual (выражение1: [T: U], выражение2: [T: U]). Это третья возможность для квадратных скобок? Я не знаю смысла их в XCTAssertEqual. У вас есть представление об этом? – LiweiZ

+1

@LiweiZ В этом нет ничего особенного. Просто выражение expression1 и expression2 имеют тип Dictionary . T и U являются типичными типами для данного варианта XCTAssertEqual. – siejkowski