2015-11-28 3 views
0

Поскольку Swift делает строгую проверку типов, иногда нам нужно конвертировать между NSString и струнных, NSArray и [AnyObject] и т.д. Но на самом деле есть два способа сделать это:Типизация или инициализация, которая лучше в Swift?

  1. , такие Приведение типов в str as String
  2. инициализации, такие как String(str)

Который более рекомендуется в Swift? Зачем?

ответ

7

Вы говорите о литье против принуждения. Это не вопрос «рекомендуется». Это совершенно разные вещи.

  • Кастинг это просто способ redescribing то компилятор. Ваша переиздание должно быть истинным уже, или вы потерпите крах во время выполнения.

    Например, вы можете применить AnyObject к String (с as!) на всякий случай is a string; вы просто рассказываете компилятору об этом, чтобы затем отправлять String-связанные сообщения этому объекту. Листинг закончен, потому что String подключен к NSString, а NSString - AnyObject, поэтому это AnyObject может быть действительно String. Но если вы лжете, и это не строка, вы столкнетесь позже, когда приложение запустится, и вы попробуете придать String то, что на самом деле не является строкой.

  • Принуждение делает новый объект полностью. Он работает только в том случае, если новый тип имеет инициализатор , который принимает старый объект.

    Например, вы не можете отличать числовые типы в Swift. Вы должны принуждать, что совсем другое - вы должны создать новый объект другого числового типа, основанный на исходном объекте. Единственный способ использовать Int8, где ожидается UInt8, - это принудить его: UInt8(x). И это законно, потому что Uint8 имеет инициализатор INT8 (как вы можете видеть в Swift заголовок):

    extension UInt8 { 
        public init(_ v: Int8) 
        // ... 
    } 
    
+0

И увидеть мою книгу. Принуждение: http://www.apeth.com/swiftBook/ch03.html#_coercion Кастинг: http://www.apeth.com/swiftBook/ch04.html#_casting – matt

+0

Большое спасибо! Так чем же ближе к намерению дизайнера языка использовать 'as' в отношении мостовых типов? – yzyzsun

+0

@yzyzsun Да, потому что они _are_ мосты, поэтому они одинаковы. Не нужно создавать новый объект. – matt

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