2015-12-05 3 views
2

Я довольно смущен, когда и как объявлять переменные в определенных точках в Swift, и это вызывает головную боль для такого нового парня, как я, в SWIFT.Разница между различными типами деклараций переменных в swift

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

Array - 
    1) var arr = NSArray()//I think its an instance of immutable NSArray type 
    2) var arr = NSMutableArray() 
    3) var arr = Array()//I have no idea of difference between NSArray and Array type. Might be both are same 
    4) var arr : NSMutableArray?//Creates an optional type but how is it different from line no.2 
    5) var arr : NSMutableArray = []//creates an empty array NSMutableArray type and again how is it different from line no.2 & 3 

Пожалуйста, уточните немного, чтобы мой уровень путаницы был немного ясен. Спасибо

+0

Объясните, что вы думаете, все они – Wain

+0

@Wain я редактирую мой вопрос с моими взглядами. Пожалуйста, исправьте меня и немного объясните. Я обновил свой вопрос. –

ответ

2

Array - это быстрый тип, где NSArray является объективом типа C. Классы NS поддерживают динамическую диспетчеризацию и технически немного медленнее для доступа, чем чистые быстрые классы.

1) вар обр = NSArray()

arr является NSArray() здесь - вы можете переназначить вещи arr, но вы не можете изменить содержимое NSArray() - это плохо выбор использовать IMO, потому что вы поместили в переменную непригодный массив. Я действительно не могу придумать причину, по которой вы хотите сделать этот звонок.

2) вар обр = NSMutableArray()

Здесь у вас есть что-то полезное. потому что массив изменяемый вы можете добавлять и удалять элементы из него

3) уаг обр = Array()

Это не будет компилировать - но var arr = Array<Int>() будет.

Массив имеет общий тип элемента (как показано ниже)

public struct Array<Element> : CollectionType, MutableCollectionType, _DestructorSafeContainer { 
    /// Always zero, which is the index of the first element when non-empty. 
    public var startIndex: Int { get } 
    /// A "past-the-end" element index; the successor of the last valid 
    /// subscript argument. 
    public var endIndex: Int { get } 
    public subscript (index: Int) -> Element 
    public subscript (subRange: Range<Int>) -> ArraySlice<Element> 
} 

4) уаг обр: NSMutableArray?

Вы определяете массив по выбору здесь. Это означает, что arr начинается со значения nil, и вы назначаете ему массив, если хотите позже, или просто сохраните его как ноль. Преимущество здесь состоит в том, что в вашем классе/структуры не будет на самом деле нужно установить значение для arr в вашем инициализаторе

5) вар обр: NSMutableArray = []

enter image description here

Похоже, что вы смешались с Факультативными значениями.

Дополнительно означает, что может быть ноль или не мог

Когда вы печатаете что-то как type?, что означает, что она nil, если не присвоить ему что-то, и как таковой вы должны разворачивать чтобы получить доступ к значениям и работать с ним.

+0

В чем разница между строкой № 3 и 4 и 5? –

+1

3) невозможно .... – user3441734

+0

@ user3441734 Почему это невозможно. Свифт говорит, что у вас может быть экземпляр отдельного типа, добавив '()' после определенного типа. –

0

@ G.Abhisek сначала о вас вопрос. var arr: NSMutableArray = [] и var arr = NSMutableArray() означает то же самое. первый из них означает, что я попрошу компилятор создать переменную типа NSMutableArray и инициализировать ее как пустой NSMutableArray. второй означает, я прошу компилятор создать переменную и назначить ей пустой инициализированный NSMutableArray. во втором случае компилятор должен вывести правильный тип переменной, в первом случае я сделал это сам. все же результат будет таким же. var arr1: Array<AnyObject> = [] и var arr2: NSMutableArray = [] - это совершенно разные вещи !. arr1 srores value type Array, arr2 хранит ссылку на экземпляр пустого класса NSMutableArray. вы можете написать let arr2: NSMutableArray = [], а затем вы можете добавить туда объект ... но вы не можете думать, как arr2 = ["a","b"]. arr2 является константой, а не переменной, поэтому значение, хранящееся там, является imutable.

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

import Foundation 

let arr1: NSMutableArray = [] 
arr1.addObject("a") 
arr1.addObject(10) 
arr1.forEach { 
    print($0, $0.dynamicType) 
    /* 
     a _NSContiguousString 
     10 __NSCFNumber 
    */ 
} 

var arr2: Array<Any> = [] 
arr2.append("a") 
arr2.append(10) 
arr2.forEach { 
    print($0, $0.dynamicType) 
    /* 
     a String 
     10 Int 
    */ 
} 

var arr3: Array<AnyObject> = [] 
arr3.append("a") 
arr3.append(10) 
arr3.forEach { 
    print($0, $0.dynamicType) 
    /* 
    a _NSContiguousString 
    10 __NSCFNumber 
    */ 
} 

print(arr1.dynamicType, arr2.dynamicType, arr3.dynamicType) 
// __NSArrayM Array<protocol<>> Array<AnyObject> 
+0

Можете ли вы сказать мне, как объявить необязательный NSMutableArray-var arr = NSMutableArray()? приводит к ошибке? –

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