Comparaison entre Java et Swift (1) Source control / Scope / Variables

introduction

Je veux faire quelque chose comme ça, principalement du point de vue d'un ingénieur Java (Java ou Swift), est-ce que je ne peux pas faire ça? Ce seront les astuces à utiliser à ce moment-là.

Java 8 a été annoncé et Kotlin a été officiellement adopté dans Android Studio 3.0, mais lorsqu'un ingénieur qui ne faisait que Java développe des applications iOS avec Xcode, ou un ingénieur qui développait des applications iOS avec Swift est Java Nous espérons que cela vous aidera si vous souhaitez vérifier au niveau de la notation de la langue lorsque vous essayez de développer Android.

Cette page traite principalement de la notation Java / Swift de "contrôle de source", "portée" et "variable". Cet article est basé sur 1.7 pour Java et Swift3 pour Swift, mais nous nous excusons pour les erreurs de notation.

--Comparaison entre Java et Swift (1) Source control / Scope / Variables

Contrôle de la source

Java Il est géré par des packages, et les packages sont (généralement) déterminés selon une hiérarchie par répertoire. Même les classes d'un même projet peuvent être traitées et créées comme des classes distinctes dans Test.class dans le package aaa.bbb.ccc et Test.class dans le package aaa.bbb.xxx.

Cependant, si vous souhaitez utiliser différentes classes de package dans le même projet, vous devez déclarer "import import target" au début du fichier source ou y accéder avec le modificateur complet. Cependant, le package java.lang contient des classes fréquemment utilisées et les classes qu'elles contiennent (String, Integer, etc.) peuvent être utilisées sans être importées explicitement.

python


import java.util.List;
import java.util.ArrayList;

public class Main {
	public static void main(String[] args) {
		List<String> list = new ArrayList();
		java.util.Map<String, String> list = new java.util.HashMap<>();
	}
}

fichier source

Le fichier source doit avoir une extension "* .java". De plus, le fichier source Java ne peut contenir qu'une seule classe publique et le nom du fichier source Java et le nom de la classe publique doivent correspondre.

Swift Dans Swift, le package est déterminé pour chaque module (projet) et le nom du module est déterminé comme espace de noms. Par conséquent, dans le même module, vous pouvez accéder uniquement par nom de classe, quelle que soit la hiérarchie du répertoire ou la source, mais vous devez faire attention aux conflits de nom de classe. À ce stade, lors de l'utilisation d'une classe d'un autre module (par exemple, un projet de bibliothèque), il est nécessaire de déclarer "import import package cible" au début du fichier source ou d'y accéder avec un modificateur complet tel que "target package.class name". il y a.

python


import Foundation

class Main {
    var arr:Array = Array<String>()
    var date:Foundation.Date = Foundation.Date()
}

fichier source

Le fichier source doit avoir une extension "* .swift". De plus, contrairement à Java, les fichiers source Swift peuvent recevoir n'importe quel nom de fichier. En outre, plusieurs classes peuvent être définies pour un nom de fichier quelle que soit la portée.

portée

Java En Java, le contrôle d'accès est essentiellement déterminé pour chaque package et classe.

Modificateur d'accès La description
public Accessible depuis toutes les classes et packages
protected Accessible dans le même package et à partir des sous-classes
(Aucun modificateur) Accessible depuis le même package
private Uniquement accessible depuis la même classe

Swift Dans Swift, le contrôle d'accès est essentiellement déterminé pour chaque module et fichier.

Modificateur d'accès La description
open Toutes les classes, accessibles à partir de différents modules(Swift3 ou version ultérieure)
public Toutes les classes, accessibles à partir de différents modules, pas Overide
internal Accessible depuis le même module
(Aucun modificateur) Même contrôle d'accès que "interne"
fileprivate Accessible depuis le même fichier(Swift3 ou version ultérieure)
private Uniquement accessible depuis le même fichier

variable

Premièrement, les deux sont des langages à typage statique. Le type est déterminé avant la compilation, et il est évident que Java etc. sont explicitement spécifiés au moment de la déclaration de variable, mais même dans le cas d'une notation telle que "var hoge1 = hoge2" au moment de la déclaration de variable comme Swift. , Le type de la variable est déterminé au moment de la déclaration par inférence de type.

Java

Méthode de déclaration de variable

Spécifiez "Nom du type Nom de la variable = Valeur initiale;".

python


String hoge = "";

La valeur initiale n'est pas requise au moment de la déclaration, et il est possible de déclarer "nom de la variable de type;", mais si la valeur n'est pas définie lors de l'accès réel à la variable, une erreur de compilation se produira. De plus, si la valeur est indéfinie, vous pouvez spécifier null, mais si vous essayez d'accéder à une variable qui est nulle, vous obtiendrez une exception NullpointerException.

Méthode de déclaration constante

Spécifiez "nom de la variable de nom de type final = valeur initiale;". Comme avec la déclaration de constante de Swift, la valeur ne peut pas être réinitialisée une fois la valeur initiale définie.

python


final String hoge = "";

Notez que Java est un langage entièrement orienté objet, donc les variables et les constantes sont toujours associées à une classe ou une instance, et les variables et les constantes ne peuvent pas être définies en dehors de la classe. À ce stade, lorsque vous définissez une constante associée à une classe, déclarez-la comme une constante statique (constante), appelez-la une constante de classe et spécifiez "nom de la variable de nom de type final statique = valeur initiale;" .. Les constantes de classe sont définies par les conventions de dénomination Java qui sont déclarées en caractères alphanumériques supérieurs et inférieurs.

Swift

Méthode de déclaration de variable

Spécifiez "nom de la variable var: nom du type = valeur initiale". En outre, Swift a une spécification de langage appelée Type facultatif, et nil ne peut pas être défini pour les variables qui ne sont pas de types facultatifs.

python


var hoge:String = ""

Qu'est-ce que le type facultatif?

Correspond au type facultatif Java8 et au type facultatif Kotlin. Le type facultatif est une variable qui peut contenir l'état nul en plus de la valeur normale du type de variable. La valeur initiale de Type facultatif est définie sur nil. Contrairement à Java, Swift garantit au niveau de la notation que les variables qui ne sont pas de type facultatif ne sont pas toujours nulles (nulles). Le type facultatif peut être spécifié explicitement ou automatiquement déroulé lorsqu'une variable est utilisée.

Type facultatif explicite

Spécifiez "?" Après le nom du type, par exemple "var nom de la variable: nom du type? = Valeur initiale".

python


var hoge:String? = ""

Si vous spécifiez un type facultatif explicite, la variable ne peut pas être utilisée de la même manière que le type d'origine et doit être déballée lorsqu'elle est utilisée. Si vous essayez de manipuler un type facultatif explicite sans le déballer, vous obtiendrez une erreur de compilation.

python


var hoge:String? = "ABC" //Déclarer une variable avec un type facultatif explicite
print(hoge.lowercased()) //Erreur de compilation
Type facultatif Unwrap

Développer un type facultatif signifie rendre les variables du type facultatif disponibles de la même manière que le type d'origine. Il y a plusieurs façons de déballer, certaines devraient être utilisées lorsqu'il n'y a aucune possibilité de zéro par programme, et d'autres devraient être utilisées quand il y a une possibilité de zéro par programme.

S'il n'y a pas de possibilité de zéro

Après avoir spécifié "!" Après le nom du type, tel que "Nom de la variable!. Opération", décrivez l'opération comme les propriétés et les méthodes.

python


var hoge:String? = "ABC" //Déclarer une variable avec un type facultatif explicite
print(hoge!.lowercased()) //"Abc" est sorti

Cependant, si la variable que vous essayez de déballer est nulle, vous obtiendrez une erreur d'exécution au moment de l'exécution.

python


hoge = nil //Le type facultatif peut être défini sur nil
print(hoge!.lowercased()) //Une erreur d'exécution se produit

Par conséquent, il est efficace lors de l'écriture des programmes suivants.

python


var hoge:String?
if Date().timeIntervalSince1970 > 0 {
    hoge = "abc"
} else {
    hoge = "cde"
}
print(hoge!.lowercased())
S'il y a une possibilité de zéro

Après avoir spécifié "?" Après le nom du type, tel que "nom de variable?. Opération", décrivez l'opération comme les propriétés et les méthodes. Contrairement au cas du déballage forcé avec "Nom de variable!. Opération", nil est renvoyé.

python


var hoge:String? = nil //Le type facultatif peut être défini sur nil
print(hoge?.lowercased()) //Aucune erreur d'exécution, nil est émis

Type facultatif implicite

Spécifiez "!" Après le nom du type, par exemple "var nom de la variable: nom du type! = Valeur initiale".

python


var hoge:String! = ""

Si vous spécifiez un type facultatif implicite, vous n'avez pas besoin de le dérouler explicitement dans votre code lorsque vous utilisez une variable, il sera automatiquement déroulé lorsque vous l'utiliserez.

python


var hoge:String! = "ABC" //Déclarer une variable avec un type facultatif implicite
print(hoge.lowercased()) //Peut être utilisé sans déballer explicitement. "Abc" est sorti

Par conséquent, lorsque vous utilisez une variable, vous pouvez essentiellement utiliser le type d'origine sans considérer qu'il est nul, mais si vous essayez d'utiliser une variable de type facultatif avec un ensemble nul, le runtime Une erreur se produira.

python


var hoge:String! = "ABC" //Déclarer une variable avec un type facultatif implicite
hoge = nil //Le type facultatif peut être défini sur nil
print(hoge.lowercased()) //Une erreur d'exécution se produit

Dans le cas d'un type facultatif implicite, il est nécessaire de l'implémenter pour qu'il soit garanti qu'il n'est pas assez nul lors de l'utilisation suffisante de la variable.

Méthode de déclaration constante

Spécifiez "let nom de la variable: nom du type = valeur initiale;". Comme pour les déclarations de constantes Java, vous ne pouvez pas réinitialiser la valeur après avoir défini la valeur initiale.

python


let hoge:String = ""

Notez que contrairement à Java, Swift n'est pas un langage orienté objet (Swift est un langage orienté protocole), il n'est donc pas toujours nécessaire de l'associer à une classe ou une instance, et il est possible de définir des constantes directement dans le fichier. Je peux le faire. Pour les constantes définies directement dans le fichier, il est garanti quasiment statiquement immuable.

Recommended Posts

Comparaison entre Java et Swift (1) Source control / Scope / Variables
[Java / Swift] Comparaison de l'interface Java et du protocole Swift
[Java] Comparaison des chaînes de caractères et && et ||
Comparaison entre Java et Swift (2) Type de base / Arithmétique / Syntaxe de contrôle / Définition de fonction
Comparaison Java et Swift (3) Implémentation de classe / héritage de classe / conception de classe
[Java] Types de variables et types
Programmation Java (variables et données)
☾ Instruction Java / Repeat et instruction de contrôle de répétition
Même jugement / jugement de valeur égale / comparaison / ordre dans Swift et Java
Série Java Primer (variations et types)
[Connaissance de base de Java] Portée des variables
Java pour les débutants, les variables et les types
[Java] Différences entre les variables d'instance et les variables de classe
Un ingénieur Java a comparé Swift, Kotlin et Java.
[Java] Comparaison des méthodes d'opération de la collection et de StringBuilder
Programmation Java (clause statique et "variables de classe")
Comparaison du projet Open Source Sentinel Java Flow Control d'Alibaba et Hystrix
[Swift vs Java] Comprenons le statique et le final
Syntaxe de contrôle Java
[Java] sortie, variables
Syntaxe de contrôle Java
Portée de la variable Java (portée)
[WIP] Variables Java
À propos des variables et de la portée (ruby)
[Java] Comparaison de cartes
Comparaison du framework Java
Portée de la variable Java
Java et JavaScript
XXE et Java
Portée de session Java
La comparaison d'énumération est ==, et equals est bonne [Java]
[Java] Différence entre statique final et final dans les variables membres
[Java] Se référer et définir des variables privées avec réflexion
Portée de la variable Java (plage où les variables peuvent être vues)
[Introduction à Java] Portée de la variable (portée, variable locale, variable d'instance, variable statique)
Comparaison équivalente de la classe wrapper Java et du type primitif
[Java Silver] Que sont les variables de classe, les variables d'instance et les variables locales?