Marcos Comparando en Objective-C y rápida
La plantilla de aplicación Maestro-Detalle utiliza un controlador de vista dividida en algunos casos y un controlador de navegación en otros. Originalmente (es decir, con el lanzamiento del iPad), el controlador de vista dividida fue pensado para el iPad, y el controlador de navegación fue pensado para el iPhone. En 2014, con la llegada del iPhone 6 Plus, la implementación cambió.
El controlador de vista dividida ahora se utiliza para dispositivos de pantalla grande y el controlador de navegación se utiliza para dispositivos de pantalla más pequeños. La línea divisoria ya no es el iPad vs iPhone: Ahora comienza con iPhone 6 Plus, que utiliza un controlador de vista dividida junto con el iPad. Otros modelos de iPhone utilizan el controlador de navegación.
Esto ha provocado una revisión al código, por lo que incluso si usted ha utilizado por años, usted debe tomar un vistazo al código en esta sección en los dos idiomas.
El controlador de la vista dividida se creó en AppDelegate (AppDelegate.swift o la combinación de AppDelegate.h y AppDelegate.m en Objective-C). Aquí, se ve la declaración y la puesta en práctica tanto en Swift y Objective-C. Como se ha señalado, te vas a encontrar este enfoque en varias ocasiones con los marcos heredados de Objective-C.
Identificar el método clave
La clave para el controlador de vista dividida es un protocolo - UISplitViewControllerDelegate. Dentro de ese protocolo, uno de los métodos más importantes es la que gestiona el colapso del controlador de vista secundario (la lista maestra, en la mayoría de los casos). Incluso el nombre de este método difiere en los dos idiomas. En la barra de salto, así es como se identifica en Swift:
splitViewController (_: collapseSecondaryViewController: ontoPrimaryViewController)
Así es como se identifica en la barra de salto en Objective-C:
-splitViewController: collapseSecondaryViewController: ontoPrimaryViewController:
El primer punto a notar es que en Objective-C, el - al comienzo identifica esto como un método de instancia en lugar de un método de clase. Esto se puede hacer en Swift, pero sólo de una manera diferente. El nombre del método en Swift no refleja su clase- o instancia-dad.
Tenga en cuenta que en la documentación, la versión de Objective-C está en la lista por el título. Después de eso, las interfaces de Objective-C Swift y se muestran (en ese orden). Este patrón parece ser utilizada en todos los marcos.
La comparación de las declaraciones
Las declaraciones reales de estos métodos se muestran aquí. Primero Swift:
opcional splitViewController func (_ splitViewController: UISplitViewController, collapseSecondaryViewControllersecondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool
A continuación, la declaración de Objective-C:
- (BOOL) splitViewController: (UISplitViewController *)splitViewControllercollapseSecondaryViewController: (UIViewController *)secondaryViewControllerontoPrimaryViewController: (UIViewController *) primaryViewController
Ahora que usted está buscando en el código real, se puede ver que hay más diferencias que sólo el - que marca esto como un método de instancia en Objective-C. Estas son las principales diferencias:
En Objective-C, el resultado de retorno se muestra entre paréntesis en el # 173-comienzo de la función, como en
- (BOOL) splitViewController:
En Swift, el resultado de retorno se muestra en la parte final de la función, como en
-> Bool
En Objective-C, los parámetros (excepto el primero) se muestran en el siguiente orden: nombre externo, el colon, el tipo (entre paréntesis y asterisco), nombre interno, como en
collapseSecondaryViewController: (UIViewController *)secondaryViewController
En Swift, los parámetros (incluida la primera) se muestran en un orden diferente: nombre externo, nombre interno, el colon, el tipo, como en
collapseSecondaryViewController secondaryViewController: UIViewController!
Tipos de Swift pueden incluir ! y ? como operadores de sufijo para indicar desenvolver o condición opcional. Además, el nombre externo puede ser desaparecido y sustituido por un guión, como en
_ SplitViewController: UISplitViewController