Vergleich zwischen Java und Swift (2) Grundtyp / Arithmetik / Steuerungssyntax / Funktionsdefinition

Einführung

Diese Seite befasst sich hauptsächlich mit der Java / Swift-Notation von "Basistypen", "arithmetischen Ausdrücken", "Steuerungssyntax" und "Funktionsdefinitionen", die häufig verwendet werden. Dieser Artikel basiert auf 1.7 für Java und Swift3 für Swift, wir entschuldigen uns jedoch für etwaige Notationsfehler.

Einführung von Grundtypen

Java

Array

Java-Arrays werden als "Typname [] Variablenname;" deklariert.

python


String[] hoge;

Java-Arrays sind jedoch keine Arrays mit variabler Länge, da ihre Größe nicht geändert werden kann, nachdem sie initialisiert und eine Instanz im Heap-Bereich zugewiesen wurde. Bei Verwendung muss die Größe angegeben werden, die im Voraus als "Typname [] Variablenname = neuer Typname [0];" gespeichert werden kann, und die Initialisierung durchgeführt werden. Es ist auch möglich, "Typname [] Variablenname = {Wert, Wert, Wert ...};" gleichzeitig mit der Deklaration als Anfangswert festzulegen.

Verwenden Sie "Anzahl der Arrays name [index]", um auf die Elemente eines Arrays zuzugreifen. Der erste Index beginnt bei 0, beispielsweise ist der letzte Index eines Arrays, das mit der Größe "3" deklariert wurde, "Größe 1" und "2". Wenn Sie versuchen, ein Element zu bearbeiten, dessen Größe nicht stimmt, wird eine Ausnahme angezeigt.

python


String[] hoge = new String[3]; //Sichern Sie ein Array der Größe 3
hoge = new String[]{"a", "b", "c"}; //Es ist auch möglich, den Anfangswert zu ersetzen und zu initialisieren

System,out.println(hoge[1]); // "b"Und Ausgabe

// hoge[3] = 1; //Eine Ausnahme tritt auf, wenn versucht wird, außerhalb des Bereichs zu arbeiten

Wenn Sie den Wert ändern, nachdem Sie die Elemente im Array abgerufen haben, sind auch die Elemente im Array selbst betroffen.

python


String[] hogeA= new String[]{"a", "b", "c"};
hogeA[0] = "x";
System.out.println(hogeA[0]); // "x"Und Ausgabe

Darüber hinaus verfügen Java-Arrays über Eigenschaften vom Referenztyp. Wenn Sie also einer Variablen in einem anderen Array ein Array zuweisen und die Ziel-Array-Variable bearbeiten, ist auch das zugewiesene Array betroffen.

python


String[] hogeA;
String[] hogeB = new String[]{"a", "b", "c"};

hogeA = hogeB;

hogeB[0] = "x";

System.out.println(hogeB[0]); // "x"Und Ausgabe
System.out.println(hogeA[0]); // "x"Und Ausgabe

List Javas "Liste" ist eines der Sammlungsframeworks, ein Typ, der doppelte Elemente zulässt und das Hinzufügen von Elementen in der angegebenen Reihenfolge ermöglicht. Da "List" die später beschriebene Schnittstelle ist, gibt es hauptsächlich ArrayList und LinkedList als instanziierte Datentypen. In der Deklaration der List-Variablen ist List eine Schnittstelle. Deklarieren Sie daher "List Variablenname = neue Implementierungsklasse der List-Schnittstelle <> ();". Geben Sie den Typnamen des Elements an, das Sie speichern möchten, indem Sie die später beschriebenen Generika "<>" verwenden.

python


List<String> hoge = new ArrayList();

Wenn Sie der Liste ein Element hinzufügen, erhöht "List variable.add (value)" automatisch die Größe und fügt das Element hinzu. Beachten Sie jedoch, dass die Elementtypen, die in Java-Listen gespeichert werden können, auf Objekttypen beschränkt sind und primitive Typen (die int, char, long usw. angeben) nicht als Elemente gespeichert werden können. Sie können auf die Elemente von List mit "List variable name.get (index)" zugreifen. Sie können es mit "Variablenname.set (Index, Wert)" ändern. Der erste Index beginnt bei 0, beispielsweise ist der letzte Index einer Liste der Größe "3" "Größe -1" und "2". Wenn Sie versuchen, ein Element zu bearbeiten, dessen Größe nicht stimmt, wird eine Ausnahme angezeigt.

python


List<Integer> test = new ArrayList<>();
test.add(1);
test.add(2);
test.add(3);

test.set(2, 9);
// System.out.println(test.get(3)); //Eine Ausnahme tritt auf, wenn versucht wird, außerhalb des Bereichs zu arbeiten

Wenn Sie den Wert nach dem Abrufen der Elemente in der Liste ändern, sind auch die Elemente in der Liste selbst betroffen.

python


//* Die Implementierung der Testklasse entfällt
List<Test> test = new ArrayList<>();

Test a1 = new Test();
a1.a1 = "1";
test.add(a1);
        
Test a2 = new Test();
a2.a1 = "2";
test.add(a2);

System.out.println(test); // ["1", "2"]Wird ausgegeben
        
Test q = test.get(1);
q.a1 = "A";
System.out.println(test); // ["1", "A"]Wird ausgegeben

Das folgende Beispiel führt jedoch zu folgenden Ergebnissen:

python


//* Die Implementierung der Testklasse entfällt
List<Test> test = new ArrayList<>();

Test a1 = new Test();
a1.a1 = "1";
test.add(a1);
        
Test a2 = new Test();
a2.a1 = "2";
test.add(a2);

System.out.println(test); // ["1", "2"]Wird ausgegeben
        
Test q = test.get(1);
Test a3 = new Test();
a3.a1 = "3";
q = a3;

System.out.println(test); // ["1", "2"]Wird ausgegeben

Wenn in diesem Beispiel das durch "String q = test.get (1);" erhaltene "q" in "q = a3;" geändert wird, wird die Referenz von "q" zu a3, aber die Liste " Der Verweis auf das Element bei Index 1 von "Test" gibt a1 an. Mit anderen Worten, die Referenz hat sich geändert, sodass sie in diesem Beispiel die Elemente der Liste "test" nicht beeinflusst.

Darüber hinaus verfügt Java List über eine Referenztyp-Eigenschaft. Wenn Sie also einer anderen List-Variablen eine List-Variable zuweisen und die List-Variable für das Zuweisungsziel bearbeiten, wird dies auch von der zugewiesenen List-Variablen beeinflusst.

python


List<Test> hogeA;
List<Test> hogeB = new ArrayList<>();

Test a1 = new Test();
a1.a1 = "1";
hogeB.add(a1);
Test a2 = new Test();
a2.a1 = "2";
hogeB.add(a2);
Test a3 = new Test();
a3.a1 = "3";
hogeB.add(a3);

hogeA = hogeB;

hogeB.get(0).a1 = "x";

System.out.println(hogeA.get(0)); // "x"Und Ausgabe
System.out.println(hogeB.get(0)); // "x"Und Ausgabe

Map

Javas "Map" ist eines der Sammlungsframeworks und ein Typ, der Werte im Schlüsselwertformat speichern kann. Es kann wie ein Swift-Wörterbuch behandelt werden. Da "Map" die später beschriebene Schnittstelle sein wird, sind die instanziierten Datentypen hauptsächlich HashMap, TreeMap und LinkedHashMap. Dictionary ist ein ähnlicher Typ, der Werte im Schlüsselwertformat speichern kann, aber Hashtable dieses Datentyps ist weniger praktisch als Map (langsam, kann keine Null speichern usw.) und verwendet jetzt "Map". Die meisten von ihnen. Da Map eine Schnittstelle zum Deklarieren von Map-Variablen ist, deklarieren Sie "Map <Name des Elementschlüsseltyps, Name des Elementwerttyps> Variablenname = neue Implementierungsklasse der Map-Schnittstelle <> ();". Geben Sie den Typnamen des Elements an, das Sie speichern möchten, indem Sie die später beschriebenen Generika "<>" verwenden. Außerdem gehören HashMap, TreeMap und LinkedHashMap zum Paket java.util, sodass Sie die Klasse bei Verwendung aus dem Paket java.util importieren müssen.

python


Map<String, String> hoge = new HashMap();

Wenn Sie Map ein Element hinzufügen, erhöht "Map variable.put (Schlüssel, Wert)" automatisch die Größe und fügt das Element mit dem angegebenen Schlüssel und Wert hinzu. Wenn zu diesem Zeitpunkt ein Schlüsselwert angegeben wird, der sich mit dem vorhandenen Schlüssel überschneidet, wird dieser überschrieben. Beachten Sie jedoch, dass die Schlüssel- und Werttypen von Elementen, die in Java Maps gespeichert werden können, auf Objekttypen beschränkt sind und primitive Typen (die int, char, long usw. angeben) nicht als Elemente gespeichert werden können. Um auf die Elemente von Map zuzugreifen, können Sie mit "Map variable name.get (key)" zugreifen. Verwenden Sie zum Entfernen eines Elements "Map variable name.remove (key)" mit dem angegebenen Schlüsselwert.

python


Map<Integer, Integer> test = new HashMap<>(); //Da Integer ein Objekttyp ist, kann er als Elementschlüssel und Werttyp angegeben werden.

test.put(1, 11);
test.put(2, 12);
test.put(3, 13);
test.put(4, 14);

test.remove(3);

System.out.println(test); // {1=11, 2=12, 4=13}Wird ausgegeben

Wenn Sie den Wert ändern, nachdem Sie die Elemente in der Karte abgerufen haben, sind auch die Elemente in der Karte selbst betroffen.

python


//* Die Implementierung der Testklasse entfällt
Map<Integer, Test> test = new HashMap<>();

Test a1 = new Test();
a1.a1 = "1";
test.put(1, a1);
        
Test a2 = new Test();
a2.a1 = "2";
test.put(2, a2);

System.out.println(test); // {1=1, 2=2}Wird ausgegeben
        
Test q = test.get(1);
q.a1 = "A";
System.out.println(test); // {1=A, 2=2}Wird ausgegeben

Das folgende Beispiel führt jedoch zu folgenden Ergebnissen:

python


//* Die Implementierung der Testklasse entfällt
Map<Integer, Test> test = new HashMap<>();

Test a1 = new Test();
a1.a1 = "1";
test.put(1, a1);

Test a2 = new Test();
a2.a1 = "2";
test.put(2, a2);

System.out.println(test); // ["1", "2"]Wird ausgegeben

Test q = test.get(1);
Test a3 = new Test();
a3.a1 = "3";
q = a3;

System.out.println(test); // ["1", "2"]Wird ausgegeben

Wenn in diesem Beispiel das durch "Test q = test.get (1);" erhaltene "q" in "q = a3;" geändert wird, wird die Referenz von "q" zu a3, der Map- "Test" jedoch weiterhin Der Verweis auf das Element des Schlüssels "1" von "" gibt a1 an. Mit anderen Worten, die Referenz hat sich geändert, sodass sie in diesem Beispiel die Elemente von Map "test" nicht beeinflusst.

Da es sich um die Schlüsselreferenz handelt, die als Schlüssel verwendet wird, wird sie auch dann als derselbe Schlüssel betrachtet, wenn dieselbe Instanz wiederverwendet und zur Map-Variablen hinzugefügt wird.

python


//* Die Implementierung der Testklasse entfällt
java.util.Map<Test, String> test = new java.util.HashMap<>();

Test a1 = new Test();

a1.a1 = "1";
test.put(a1, "A"); // (1)Instanz als Schlüssel hinzufügen

a1.a1 = "2";
test.put(a1, "B"); // (2)In derselben Instanz hinzufügen

System.out.println(test); // (2)Überschrieben als Mehrwert{2=B}Wird ausgegeben

Da Java Map die Eigenschaft des Referenztyps hat, wird die Zuweisung einer Map-Variablen zu einer anderen Map-Variablen und die Bedienung der zugewiesenen Map-Variablen von der zugewiesenen Map-Variablen beeinflusst.

python


Map<Integer, Test> hogeA;
Map<Integer, Test> hogeB = new HashMap();

Test a1 = new Test();
a1.a1 = "1";
hogeB.put(1, a1);
Test a2 = new Test();
a2.a1 = "2";
hogeB.put(2, a2);
Test a3 = new Test();
a3.a1 = "3";
hogeB.put(3, a3);

hogeA = hogeB;

hogeB.get(1).a1 = "x";

System.out.println(hogeA.get(1)); // "x"Und Ausgabe
System.out.println(hogeB.get(1)); // "x"Und Ausgabe

Anderer Vergleich mit Swift

Unten finden Sie einen Vergleich der Java- und Swift-Datentypen.

Swift

Array

Das Swift-Array deklariert "var variable name: [type name] = []". Sie können auch "var variable name: Array = Array ()" deklarieren. Es ist auch möglich, "var Variablenname: Typname [] = [Wert, Wert, Wert ...]" gleichzeitig mit der Deklaration als Anfangswert festzulegen. Das Swift-Array ist ein Array mit variabler Länge. Wenn Sie "array variable name.append (value)" eingeben, wird die Größe automatisch erweitert und Elemente werden hinzugefügt. Im Fall von Swift muss die Größe nicht im Voraus angegeben werden, und sie kann wie ein Java-Listentyp verwendet werden.

python


var test:[Int] = [] //Für Swift ist es nicht erforderlich, die Größe im Voraus anzugeben

test.append(1) //Wird aufgrund eines Arrays mit variabler Länge automatisch erweitert

Verwenden Sie "Array-Variablenname [Index]", um auf die Elemente eines Arrays zuzugreifen. Der erste Index beginnt bei 0, beispielsweise ist der letzte Index eines Arrays, das mit der Größe "3" deklariert wurde, "Größe 1" und "2".

Wenn Sie den Wert ändern, nachdem Sie die Elemente im Array abgerufen haben, sind auch die Elemente im Array selbst betroffen.

python


var test:[Int] = [1, 2, 3]
test[0] = 9
print(test); // [9, 2, 3]Und Ausgabe

Das folgende Beispiel führt jedoch zu folgenden Ergebnissen:

python


//* Die Implementierung der Testklasse entfällt
var a1 = Test(a1: 1)
var a2 = Test(a1: 2)
var a3 = Test(a1: 3)
var test:[Test] = [a1, a2, a3]
print(test); // [Test(a1: 1), Test(a1: 2), Test(a1: 3)]Und Ausgabe

var q = test[0]
var temp:Test = Test(a1: 9)
q = temp
print(test); // [Test(a1: 1), Test(a1: 2), Test(a1: 3)]Und Ausgabe

Wenn in diesem Beispiel "q", erhalten durch "var q = test [0]", in "q = temp" geändert wird, wird die Referenz von "q" zu temp, aber Index 1 des Arrays "test" wird weiterhin verwendet. Die Elementreferenz auf gibt a1 an. Mit anderen Worten, die Referenz hat sich geändert, sodass sie in diesem Beispiel die Elemente von Map "test" nicht beeinflusst.

Dies gilt jedoch nicht beim direkten Umschreiben, z. B. "test [0] = Test (a1: 9)".

//* Die Implementierung der Testklasse entfällt
var a1 = Test(a1: 1)
var a2 = Test(a1: 2)
var a3 = Test(a1: 3)
var test:[Test] = [a1, a2, a3]
print(test); // [Test(a1: 1), Test(a1: 2), Test(a1: 3)]Und Ausgabe

test[0] = Test(a1: 9)
print(test); // [Test(a1: 9), Test(a1: 2), Test(a1: 3)]Und Ausgabe
print(a1); // [Test(a1: 1)Und Ausgabe

Im Gegensatz zu Java sind Swift-Arrays eher Werttypen als Referenztypen. Wenn Sie einer Variablen in einem anderen Array ein Array zuweisen und die Ziel-Array-Variable bearbeiten, ist das zugewiesene Array nicht betroffen.

python


var test1:[Int] = [1, 2, 3]
var test2:[Int] = [4, 5, 6]

test2 = test1 //Einer anderen Arrayvariablen zuweisen(※1)

test1[0] = 9
print(test1); // [9, 2, 3]Und Ausgabe
print(test2); // (※1)Weil das Array selbst ein Werttyp ist[1, 2, 3]Wird ausgegeben

Wörterbuch

Ein Wörterbuch ist ein Typ, der Werte im Schlüsselwertformat speichern kann. Deklarieren Sie "var Variablenname: [Name des Elementschlüsseltyps, Name des Elementwerttyps] = [:]". Sie können auch "var Variablenname: Dictionary <Name des Elementschlüsseltyps, Name des Elementwerttyps> = [:]" deklarieren. Es ist auch möglich, "var Variablenname: Wörterbuch <Name des Elementschlüsseltyps, Name des Elementwerttyps> = [Elementschlüssel: Elementwert, Elementschlüssel: Elementwert ...]" gleichzeitig mit der Deklaration als Anfangswert festzulegen.

python


var test1:[Int:String] = [:]
var test2:Dictionary = Dictionary<Int, String>() //Es ist auch möglich, es wie links gezeigt zu deklarieren

Wenn Sie dem Wörterbuch ein Element hinzufügen, fügt "Name der Wörterbuchvariablen [Elementschlüssel] = Elementwert" das Element dem vorhandenen Wörterbuch hinzu. Wenn zu diesem Zeitpunkt ein Schlüsselwert angegeben wird, der sich mit dem vorhandenen Schlüssel überschneidet, wird dieser überschrieben. Das Element wird entfernt, indem der Wert "nil" mit "Dictionary variable name [key] = nil" mit dem angegebenen Schlüsselwert angegeben wird. Verwenden Sie "Dictionary-Variablenname [Schlüssel]", um auf die Elemente des Wörterbuchs zuzugreifen.

Wenn Sie den Wert ändern, nachdem Sie die Elemente im Wörterbuch abgerufen haben, sind auch die Elemente im Wörterbuch selbst betroffen.

python


//* Die Implementierung der Testklasse entfällt
var items: Dictionary<Int, Test> = [:]

items[1] = Test(a1: 1)
print(items[1]!.a1) //Wird als 1 ausgegeben

var q = items[1]!
q.a1 = 9
print(items[1]!.a1) //Wird als 9 ausgegeben

Das folgende Beispiel führt jedoch zu folgenden Ergebnissen:

python


//* Die Implementierung der Testklasse entfällt
var items: Dictionary<Int, Test> = [:]

var a1 = Test(a1: 1)
items[1] = a1
print(items[1]!.a1) //Wird als 1 ausgegeben

var q:Test  = items[1]!
var a3:Test = Test(a1: 9)
q = a3

print(items[1]!.a1) //Wird als 1 ausgegeben

Wenn in diesem Beispiel "q", erhalten durch "var q: Test = items [1]!", In "q = a3" geändert wird, wird die Referenz von "q" zu a3. Dennoch ist der Schlüssel des Wörterbuchs "test". Der Verweis auf das Element "1" gibt a1 an. Mit anderen Worten, die Referenz hat sich geändert, sodass sie in diesem Beispiel die Elemente von Map "test" nicht beeinflusst.

Dies gilt jedoch nicht beim direkten Umschreiben, z. B. "test [1] = Test (a1: 9)".

//* Die Implementierung der Testklasse entfällt
var items: Dictionary<Int, Test> = [:]

var a1 = Test(a1: 1)
items[1] = a1
print(items[1]!.a1) //Wird als 1 ausgegeben

items[1] = Test(a1: 9)

print(items[1]!.a1) //Wird als 9 ausgegeben
print(a1.a1) //Wird als 1 ausgegeben

Darüber hinaus kann der Elementwert einen beliebigen Datentyp angeben. Wenn Sie jedoch ein Objekt als Schlüssel angeben möchten, muss das Schlüsselobjekt das Hashable-Protokoll implementieren.

Beispielimplementierung des Wörterbuch-Hashable-Protokolls

python


///Muss dem Hashable-Protokoll entsprechen, um TestClass als Wörterbuchschlüssel zu verwenden
public class TestClass : Hashable {
    var a1:String = ""
    init (a1:String) {
        self.a1 = a1
    }
    ///Hash-Werte werden in der Equatable-Implementierung verwendet
    public var hashValue: Int {
        get {
            ///Wenn dieser Hashwert gleich ist, wird er im Wörterbuch als gleich behandelt.
            return a1.hashValue
        }
    }
}

///Gleichwertige Implementierung von TestClass
func == (lhs:TestClass, rhs:TestClass) -> Bool {
    return lhs.hashValue == rhs.hashValue
}

python


var items: Dictionary<TestClass, Int> = [:]
var a1:TestClass = TestClass(a1 : "A")
var a2:TestClass = TestClass(a1 : "B")
var a3:TestClass = TestClass(a1 : "C")
var a4:TestClass = TestClass(a1 : "D")
var a5:TestClass = TestClass(a1 : "A")

items[a1] = 1
items[a2] = 2
items[a3] = 3
items[a4] = 4
items[a5] = 5
for (k, v) in items { // A : 5、B : 2、C : 3、D :Wird als 4 ausgegeben
    print(k.a1 + " : " + v.description)    
}

Im obigen Beispiel wird eine weitere Instanz mit "var a1: TestClass = TestClass (a1:" A ")" und? "Var a5: TestClass = TestClass (a1:" A ")" und dem Wörterbuch "items" erstellt. "A1" und "a5" wurden als der gleiche Schlüssel behandelt, obwohl sie zu "" hinzugefügt wurden. Dies liegt daran, dass die als obiger Schlüssel erstellte Testklasse "TestClass.a1.hashValue" für die Schlüsselübereinstimmungsprüfung verwendet. Wenn sie übereinstimmt, wird sie so implementiert, dass sie als derselbe Schlüssel betrachtet wird. ist.

Taple

Ein Taple ist ein Datentyp, der einfacher zu handhaben ist als eine Struktur und aus mehreren Werten besteht. Eine Sprachspezifikation, die in Java nicht vorhanden ist. Dies kann nützlich sein, insbesondere wenn es sich um Gruppen verwandter Werte handelt, die vorübergehend verwendet werden, z. B. den Rückgabewert einer Funktion, die die Breite und Höhe der Bildschirmgröße zurückgibt. Die Funktionen sind unten aufgeführt.

Geben Sie in der Deklaration "var Variablenname: (Typname, Typname, Typname ...)" an und beschreiben Sie den Typ, den Sie als Tupel verwalten möchten, in Klammern "()". Es ist auch möglich, den Anfangswert festzulegen, wenn "var variable name: (Typname, Typname) = (Wert, Wert)" deklariert wird. Darüber hinaus ist es möglich, den zu kombinierenden Mitgliedern einen externen Namen zu geben, und es heißt "var Variablenname: (externer Name: Typname, externer Name: Typname) = (externer Name: Wert, externer Name: Wert)". Kann beschrieben werden als

python


var test1:(name:String, age:Int) //Kann leicht durch Angabe eines externen Namens verstanden werden
test1 = (name:"NYANKO", age:100)

print(test1.name) //Sie können auch über einen externen Namen darauf zugreifen
let test2:(String, Int) = ("WANKO", 2)  //Es ist möglich, ohne Angabe eines externen Namens zu deklarieren, und es ist möglich, durch Mustervergleich zu ersetzen.

print(test2.1) //Beim Zugriff kann der Index verwendet werden
if (test2 == ("WANKO", 2)) { //Ein Vergleich durch Mustervergleich ist ebenfalls möglich
    print("same.")
}

Struktur

Swift bietet Strukturen als einfache Möglichkeit, eine Kapselung zu erreichen. Es zeichnet sich durch die Verwaltung einfacher Daten aus und wird häufig zur Darstellung von Datenstrukturen wie dem Rückgabewert einer Funktion verwendet, die die Breite und Höhe der Bildschirmgröße zurückgibt. Zum Zeitpunkt der Definition ist es als "Name der Strukturstruktur {...}" definiert, und die Mitglieder sind in den Blöcken der Struktur definiert. Deklarieren Sie in der Deklaration "var Strukturvariablenname = Struktur ()". Die Struktur verfügt über einen Standardkonstruktor, und es ist auch möglich, ihn während des Initialisierungsprozesses als externen Namen zu initialisieren, indem der Variablenname des in der Struktur definierten Elements verwendet wird. Die Funktionen sind unten aufgeführt.

Strukturen sind in ihrer Verwendbarkeit ähnlich wie Klassen, aber der Hauptunterschied zu Klassen besteht darin, dass die Struktur ≒ Wert ist.

Selbst wenn die Klasse eine Instanz erstellt und sie "Variable A" und einer anderen "Variablen B" zuweist, wird die Operation für die Instanz ausgeführt. Zum Beispiel ist die Instanz "Yoshiko" manchmal "Reinigungstante" Variable A "" und manchmal "Phantomdieb reife Frau vierzehn" Variable B "", aber als "Reinigungstante" Takano Yuri Beauty Clinic Wenn Sie operiert werden, erhöht sich auch die Büste von "Phantom Thief Mature Woman Fourteen". Im Gegenteil, wenn die Struktur "Variable A '" und einer anderen "Variablen B'" zugewiesen wird, wird sie als ein anderer Wert behandelt.

python


public class TestClass {
    var a1:String = ""
}

public class TestStruct {
    var a1:String = ""
}

var testStruct:TestClass = TestClass() //Struktur deklarieren
var testClass:TestClass = TestClass() //Deklarieren Sie eine Instanz der Klasse
testStruct.a1 = "ABC"
testClass.a1 = "ABC"

var assignmentStruct = testStruct //Ersatzstruktur
var assignmentClass = testClass //Weisen Sie eine Instanz der Klasse zu

assignmentStruct.a1 = "DEF"
assignmentClass.a1 = "DEF"

print(testStruct.a1) //Weil die Struktur kopiert wird"ABC"Wird ausgegeben
print(testClass.a1) //Der Klasse wird eine Referenz übergeben, sodass sie vom Zuweisungsziel beeinflusst wird"DEF"Wird ausgegeben

struct TestStruct {
    var a1:String = ""
}
class TestClass {
    var a1:String = ""  
}

Anderer Vergleich mit Java

Geben Sie einen Alias ein

Mit Swift können Sie vorhandene Typen mit Aliasnamen verwenden.

public typealias hoge1 = Int
public typealias hoge2 = (String, Int, Int)

var a1:hoge1 = 1
var a2:hoge2 = ("ABC", 1, 2)

print(a1)
print(a2)

Arithmetischer Ausdruck

Java und Swift haben dieselbe Operation mit vier Regeln sowie Vergleichsoperatoren und Inkrement- / Dekrement-Notationen. Wenn Sie also mit einer davon vertraut sind, sollten Sie sie problemlos verstehen können.

Steuerungssyntax

If-Anweisung

Java

python


int test = 1;
if (test == 1) {
    System.out.println("1");
} else if (test == 1) {
    System.out.println("2");
} else {?
    System.out.println("3");
}

Swift Wenn Sie einen bedingten Ausdruck schreiben, können Sie "(bedingter Ausdruck)" in Klammern hinzufügen, es ist jedoch eine allgemeine Notation, ihn nicht hinzuzufügen.

python


var test = 1;
if test == 1 {
    print("1")
} else if test == 1 {
    print("2")
} else {
    print("3")
}

Switch-Anweisung

Java

Java kann nur char, byte, short, int, Character, Byte, Short, Integer, String (JDK 1.7 oder höher) oder enum verwenden, um switch-Anweisungen auszuwerten. Nachdem Sie den Block der case-Anweisung mit dem übereinstimmenden Bewertungsergebnis verarbeitet haben, können Sie den bedingten Zweig des Switch verlassen, indem Sie eine explizite break-Anweisung platzieren. Wenn daher mehrere Auswertungswerte dieselbe Verarbeitung ausführen, wird die Unterbrechung nicht beschrieben.

python


int test = 1;
switch(test) {
    case 1:
    case 2:
        System.out.println("A");
        break;
    case 3:
        System.out.println("C");
        break;
    default:
        System.out.println("D");
}

Swift

Im Gegensatz zu Java ist es möglich, Ausdrücke und Werte (Variablen) im Bewertungsziel "Schalter (Bewertung)" festzulegen und Zeichenfolgen, Ausdrücke usw. zusätzlich zu Ganzzahlen im Bewertungsergebnis "Fallbewertungswert:" festzulegen. ist. Darüber hinaus ist keine explizite break-Anweisung erforderlich. Wenn eine Verarbeitung unterhalb der case-Anweisung des übereinstimmenden Bewertungsergebnisses durchgeführt wird, wird keine Verarbeitung unterhalb der anderen case-Anweisungen durchgeführt. Wenn daher mehrere Auswertungswerte dieselbe Verarbeitung ausführen, beschreiben Sie die Auswertungswerte in "case" durch Kommas getrennt.

python


var test:Int = 1
switch test {
    case is Test:
        //Wenn der Typ Test ist
        print("A")
    case is Int:
        //Wenn der Typ Int ist
        print("B")
    case 1111, 2222:
        //Wenn der Wert 1111 oder 2222 ist
        //Wenn der Testtyp jedoch nicht in erster Linie Int ist, wird "Ausdrucksmuster vom Typ" angezeigt.'Int'kann nicht mit Werten vom Typ ~ "übereinstimmen,
        print("C")
    default:
        print("D")
}

zur Aussage

Java

Die Grundform wird wie folgt beschrieben.

python


for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

Wenn Sie die Elemente einzeln überprüfen möchten, können Sie die erweiterte for-Anweisung verwenden. Es kann mit Instanzen von Klassen verwendet werden, die die Iterable-Schnittstelle, Arrays usw. implementieren.

python


List<Integer> list = new ArrayList(); //List implementiert Iterable, sodass erweiterte Anweisungen verwendet werden können
for (Integer item : list) {
    System.out.println(i);
}

Swift

Die Grundform wird wie folgt beschrieben.

python


for i in 0 ..< 10 {
    print(i)
}

Wenn Sie die Elemente einzeln überprüfen möchten, können Sie die erweiterte for-Anweisung verwenden. Es kann für Instanzen von Klassen verwendet werden, in denen das SequenceType-Protokoll, Arrays usw. implementiert sind.

python


for (item in 1..10) {
    print(i)
}

while-Anweisung

Im Fall von Swift ist die Notation für Java und Swift dieselbe, außer dass "(bedingter Ausdruck)" und Klammern weggelassen werden können. Wenn Sie also mit beiden vertraut sind, können Sie sie problemlos verstehen.

Funktionsdefinition

Java

Die Notation beim Definieren einer Funktion in Java lautet wie folgt.

python


//Zugriffsmodifikator Rückgabetyp Funktionsname(Argumenttyp Name der Argumentvariablen) {
//return Rückgabewert;
// }
private int test(int value) {
    return value;
}

//Wie rufe ich an?
test(1);

Als besondere Anmerkung werden in Java die an die Funktion übergebenen Argumente nicht ausschließlich als Referenz übergeben, aber ich denke, es ist gut zu verstehen, dass der übergebene Wert innerhalb der Funktionsfunktion manipuliert werden kann. Wenn Sie damit beispielsweise eine Instanz innerhalb einer Funktion neu erstellen, können Sie feststellen, dass sie nicht als Referenz übergeben wird.

python


Test test = new Test();
test.a1 = "1";

Test newTest = newTest(test);

System.out.print(test); //1 wird ausgegeben
System.out.print(newTest); //null wird ausgegeben

private Test newTest(Test test) {
    test = new Test(); //Eine neue Referenz wird erstellt
    test.a1 = "2";
    return test;
}

Bei unveränderlichen Argumenten ändert sich der Wert des Aufrufers auch dann nicht, wenn der Argumentwert in der Funktion manipuliert wird.

python


int value = 1;
test(value);
System.out.println(a); //1 wird ausgegeben

private void test(int value) {
    value = 2;
}

Swift

Die Notation beim Definieren einer Funktion in Swift lautet wie folgt.

python


//Funktionsname(Externer Name Name der Argumentvariablen:Argumenttyp=Standardwert) ->Rückgabetyp{
//return Rückgabewert;
// }
private func test(test value:Int = 9) -> Int {
    return value;
}

//Wie rufe ich an?
test(test:1);

--Wenn es keinen Rückgabewert gibt, können Sie eine Funktion ohne Rückgabewert definieren, indem Sie "Void" in "Rückgabetyp" angeben oder weglassen.

In Swift werden die an die Funktion übergebenen Argumente als Wert übergeben, es gibt jedoch eine Möglichkeit, als Referenz zu übergeben.

python


var a = 1
test(&a)
print(a) //Das Ergebnis ist "2", da es als Referenz übergeben wurde.

func test(value:inout Int) {
    a = 2
}

Swift kann Funktionen auch als Werte behandeln. Beispielsweise kann die Typinformation einer Funktion, die ein Zeichenfolgenargument enthält und den Rückgabewert der Zeichenfolge zurückgibt, als "(Zeichenfolge) -> Zeichenfolge" ausgedrückt werden.

python


let funcTest:(String)->String = test // func test(name:String) -> String {...}In funcTest
let message = funcTest("Swift") //Funktionstest aus der Variablen, in der die Funktion gespeichert ist(name:String) -> String {...}Anruf
print(message)

//Funktion
func test(name:String) -> String {
    return "Hallo" + name + "Herr."
}

Sie können eine Funktion auch an eine Funktion übergeben, da Swift sie als Wert behandeln kann.

python


let funcTest:(String)->String = test // func test(name:String) -> String {...}In funcTest
callTest(name: "Java", function: funcTest) // callTest(name:String, function:(String)->String) {...}Anruf

//Funktion
func test(name:String) -> String {
    return "Hallo" + name + "Herr."
}

//Test übergeben(name:String) ->Funktion zum Ausführen von String
func callTest(name:String, function:(String)->String) {
    let message = function(name) //Test übergeben(name:String) ->String aufrufen
    print(message)  
}

Es ist auch möglich, eine Funktion innerhalb einer Funktion zu definieren und zu verwenden.

//Ausführungsmethode
func exe() {
    let value = test(value1: 5, value2:3) //Funktionsaufruf
    print(value.0)
    print(value.1)
}
//Funktionen, die Funktionen enthalten
func test(value1:Int, value2:Int) -> (Int, Int) {
    //Interne Funktion(1)
    func add(value1:Int, value2:Int) -> Int {
        return value1 + value2
    }
    //Interne Funktion(2)
    func subtract(value1:Int, value2:Int) -> Int {
        return value1 - value2
    }
    
    let result1 = add(value1: value1, value2: value2) //Interne Funktion(1)Holen Sie sich das Ergebnis von
    let result2 = subtract(value1: value1, value2: value2) //Interne Funktion(2)Holen Sie sich das Ergebnis von
    
    return (result1, result2)
}

Anonyme und übergeordnete Funktionen

Da Sie mit Swift anonyme Funktionen implementieren können, können Sie auch anonyme Funktionen in Variablen festlegen. Anonyme Funktionen können ohne Deklaration einer Funktion (ohne Angabe eines Funktionsnamens) verwendet und wie folgt behandelt werden.

python


// {(Argumentname:Name des Argumenttyps) -> (Typname zurückgeben) in
//     //wird bearbeitet
//return Rückgabewert
// }

// (1)Wenn es kein Argument und keinen Rückgabewert gibt
let closure1 = {() -> () in
    print("test1")
}
closure1() // "test1"Und Ausgabe

// (2)Kein Argument, Rückgabewert String
let closure2 = {() -> String in
    return "test2"
}
print(closure2()) // "test2"Und Ausgabe
    
// (3)Geben Sie für die Argumente String, Int String zurück
let closure3 = {(param1:String, param2:Int) -> String in
    return param1 + param2.description
}
print(closure3("test", 3)) // "test3"Und Ausgabe
    
// (4)Bei Verwendung der Typinferenz zum Zeitpunkt des Aufrufs ohne Angabe des Argumenttyps Bei Rückgabewert Int
let closures4:(String, Int) -> String
closures4 = {(param1, param2) -> String in
    return param1 + param2.description
}
print(closures4("test", 4)) // "test4"Und Ausgabe

Sie können ein Funktionsliteral als Argument an eine Funktion übergeben. Es ist nicht erforderlich, separate Funktionen zu deklarieren, z. B. wenn Sie jede Verarbeitung gemäß dem Aufrufer ausführen möchten, nachdem Sie die Funktionsverarbeitung ausgeführt haben, in der die Funktion deklariert ist.

python


//Ausführungsmethode
func exe() {
    //Dreiecksflächenberechnung(Vertikal x horizontal ÷ 2)In einer Variablen als anonyme Funktion
    var calcTriangle = { (width:Int, height:Int) -> (Int) in
        return width * height / 2
    }
    //Berechnung der Rechteckfläche(Vertikal x horizontal)In einer Variablen als anonyme Funktion
    var calcRctangle = { (width:Int, height:Int) -> (Int) in
        return width * height
    }
    print(calcAreaScreenRect(areaLogic: calcTriangle)) //Dreieckige Flächenberechnung Ruft die Flächenberechnungsfunktion nach Bildschirmgröße mit einer anonymen Funktion als Argument auf
    print(calcAreaScreenRect(areaLogic: calcRctangle)) //Rufen Sie die Flächenberechnungsfunktion für jede Bildschirmgröße mit der anonymen Funktion zur Berechnung der rechteckigen Fläche als Argument auf
}
///Flächenberechnung nach Bildschirmgröße
func calcAreaScreenRect(areaLogic:(Int, Int) -> (Int)) -> Int{
    let rect = UIScreen.main.bounds;
    return areaLogic(Int(rect.width), Int(rect.height))
}

Anonyme Funktionen können aufgrund der Eigenschaften des lexikalischen Bereichs auch auf die aufrufende Variable zugreifen. Verwenden Sie eine anonyme Funktion als Argument

python


var message = "Hello"
var printHello = {
    print(message) //Anonyme Funktion kann auf Nachricht zugreifen
}
printHello() // "Hello"Und Ausgabe

Wie in der Funktionsdeklaration erläutert, können Sie eine als Intervallnummer deklarierte Funktion als Argument verwenden, auch wenn es sich nicht um eine anonyme Funktion handelt. Eine solche Funktion wird als Funktion höherer Ordnung bezeichnet.

Schließung

Closure (Funktionsabschluss) ist kurz gesagt die Definition einer Funktion innerhalb einer Funktion. Insbesondere bezieht es sich auf ein "Funktionsobjekt, das von einer anonymen Funktion realisiert wird". Da Swift anonyme Funktionen verwenden kann, können Verschlüsse verwendet werden.

python


func getCounter()->()->Int {
    var counter = 0
    //Anonyme Funktion
    let countUp = { ()->Int in
        counter += 1
        return counter
    }
    return countUp
}

Im obigen Beispiel wird eine Funktion namens "getCounter" deklariert, sodass eine anonyme Funktion intern definiert und diese Funktion zurückgegeben wird. Das Aufrufen dieser Funktion hat folgendes Ergebnis:

python


let funcGetCounter:()-> Int = getCounter() //Anonyme Funktion des Rückgabewerts von getCounter

print(funcGetCounter()) // "1"Wird ausgegeben
print(funcGetCounter()) // "2"Wird ausgegeben
print(funcGetCounter()) // "3"Wird ausgegeben

Die in "let funcGetCounter" gespeicherte anonyme Funktion wird bei jedem Aufruf hochgezählt. Auf diese Weise bleibt der "var counter" in der Funktion "getCounter", auf den die anonyme Funktion im lexikalischen Bereich verweist, erhalten, bis die Referenz "let funcGetCounter" verloren geht, und kann wie eine Instanz einer Klasse verwendet werden.

Recommended Posts

Vergleich zwischen Java und Swift (2) Grundtyp / Arithmetik / Steuerungssyntax / Funktionsdefinition
Vergleich zwischen Java und Swift (1) Quellcodeverwaltung / Umfang / Variablen
[Java / Swift] Vergleich von Java-Schnittstelle und Swift-Protokoll
Java-Steuerungssyntax
Java-Steuerungssyntax
Java- und Swift-Vergleich (3) Klassenimplementierung / Klassenvererbung / Klassendesign
Informationen zum Java-Grunddatentyp- und Referenztypspeicher
[Java] Vergleich von Zeichenketten und && und ||
[Java] Datentyp ①-Basistyp
[Java] Hinweis zur Steuerungssyntax
[Java] Unterschied zwischen der Zuweisung der Basistypvariablen und der Zuordnung der Referenztypvariablen
Gleiches Urteil / gleichwertiges Urteil / Vergleich / Reihenfolge in Swift und Java
Java-Überprüfung ③ (Steuerungssyntax [if / switch / while / for], bedingter Ausdruck)
Java-Basissyntax + α-Trap
Basisdatentyp und Referenztyp
[Java] Vergleich der Geschwindigkeit der Typkonvertierung
Definition und Instanziierung von Java-Klassen
Studieren Sie Java # 7 (Art der Verzweigungssyntax)
☾ Java / Repeat-Anweisung und Repeat-Steueranweisung
[Java] Zusammenfassung der Steuerungssyntax