Swift言語、C#言語とのコードを相互変換

# 概要
Swift言語とC#言語でのコードの書き方の違いを比較してみました。
C#に慣れている人がSwiftで実装、
逆にSwiftに慣れている人がC#で実装する場合に参考として作成しました。

(前提条件)

- 全ての機能は比較をしていません。（あくまで把握している部分のみ）
- 2017/12月時点での比較内容です。

# 主に参考にしたサイト
- Swift
[公式リファレンス](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097-CH3-ID0)

- C#
 [++C++; // 未確認飛行 C](http://ufcpp.net/) : C#の豊富な情報がいっぱいです。

## 検証環境
|PC|OS|バージョン|
|:-:|:-:|:-:|
|Mac|Sierra|10.12.6|

|開発環境|Swift|C#|
|:-:|:-:|:-:|
|ツール|xcode|visual studio for mac|
|バージョン|7.3|9.2|

## 言語
|言語|使用バージョン|
|:---:|:--------:|
|Swift|4.0.3|
|C#|7|

## 変数
Swift

```swift
// 文字列型の変数「str」宣言
var str: String = "Hello, Swift"
```

C#

```csharp
// 文字列型の変数「str」宣言
string str = "Hello, C#";
```

## 定数
Swift

```swift
let str: String = "Hello, Swift"

// 宣言のみも可能
let message: String
// 宣言だけした定数は一度のみ代入できる
message = "Message"
// ２度代入するとビルドエラーになる
```

C#

```csharp
// ローカルスコープ内で定義した定数はconstを指定
const string str = "Hello, C#";
```

## 配列
Swift

```swift
var numbers: [Int] = [1, 2, 3]
var numbers = [1, 2, 3]
```

C#

```csharp
int[] numbers = { 1, 2, 3 };
var numbers = new[] { 1, 2, 3 };
```

## 辞書
Swift

```swift
// 辞書データ作成を言語でサポートしている
var dictionary = ["one": 1, "two": 2]
for (key, value) in dictionary
{
  print( "key = \(key), value = \(value)" )
}
```

C#

```csharp
using System;
// 辞書データを実装するためにはDictionaryクラスが必要
using System.Collections.Generic;

Dictionary<string, int> dic = new Dictionary<string, int>()
{
  {"one", 1},
  {"two", 2},
};

foreach (KeyValuePair<string, int> kvp in dic)
{
  Console.WriteLine($"key = {kvp.Key}, value = {kvp.Value}"); 
}
```

## for文
Swift

```swift
for num in 0...3
{
    print(num)
}

var numbers = [4, 5, 6]
for num in numbers
{
    print( num )
}
```

C#

```csharp
using System;

for (int i = 0; i < 4; ++i)
{
  Console.WriteLine(i);
}

var numbers = new[] { 4, 5, 6 };
foreach (int i in numbers)
{
  Console.WriteLine(i);
}
```

## while文
Swift

```swift
var index = 0
while index < 5
{
    print(index)
    index = index + 1
}
```

C#

```csharp
using System;

var index = 0;
while (index < 5)
{
  Console.WriteLine(index);
  index++;
}
```

## if文
Swift

```swift
if index == 0
{
    print("index is \(index)")
}
```

C#

```csharp
using System;

if ( index == 0 )
{
  Console.WriteLine("index is {0}", index);
} 
```

## switch文
Swift

```swift
var number = 0
switch( number )
{
    case 0:
        print("0")
    case 1:
        print("1")
    default:
        print("error")
}
```

C#

```csharp
using System;

var number = 0;
switch ( number )
{
  case 0:
    Console.WriteLine("0");
    break;
  case 1:
    Console.WriteLine("1");
    break;
  default:
    Console.WriteLine("2");
    break;
}
```

## 関数
Swift

```swift
// func 名前(引数)
func Func(num: Int)
{
}
Func(num: 1)
// 引数名を指定しないとエラーになる
//Func(1)

// _ 引数 とすると呼び出し時に引数名が不要になる
func Func2(_ num: Int)
{
}
Func2(1)

// func 関数名() -> 戻り値の型
func Func3() -> Int
{
    return 0
}
```

C#

```csharp
class Funcsion
{
  public int num = 0;

  public void Func(int num)
  {
    this.num = num;
  }

  public int Func3()
  {
    return 0;
  }
}

Funcsion func = new Funcsion();
// 引数名を指定しての設定と指定なしの両方が可能
func.Func(num: 1);
func.Func(1);

int num = func.Func3();
```

## 構造体
Swift

```swift
struct Man
{
    var power = 10
    var name = ""
    
    init(name: String, power: Int)
    {
        self.name = name
        self.power = power
    }
    
    func walk()
    {
        print("\(self.name) walk \(self.power) power")
    }
}
```

C#

```csharp
struct Man
{
  public int power;
  public string name;
  
  public Man(string name, int power)
  {
    this.name = name;
    this.power = power;
  }

  public void walk()
  {
    Console.WriteLine("{0} walk {1} power", this.name, this.power);
  }
}
```

## クラス
Swift

```swift
class Woman
{
    fileprivate var power = 0
    fileprivate var name = ""
    
    init(name: String, power: Int)
    {
        self.name = name
        self.power = power
    }
    
    open func attack()
    {
       print("\(self.name) attack about \(self.power) power")
    }
}
```

C#

```csharp
using System;

class Woman
{
  private int power;
  private string name;

  public Woman(string name, int power)
  {
    this.name = name;
    this.power = power;
  }

  public void attack()
  {
    Console.WriteLine("{0} attack about {1} power", this.name, this.power);
  }
}
```

## インターフェイス
Swift

```swift
protocol Human
{
    func walk()
}

class Man: Human
{
    func walk()
    {
        print("man walk")
    }
}

class Woman: Human
{
    func walk()
    {
        print("woman walk")
    }
}
```

C#

```csharp
using System;

interface Human
{
  void walk();
}

class Man : Human
{
  public void walk()
  {
    Console.WriteLine("man walk");
  }
}

class Woman : Human
{
  public void walk()
  {
    Console.WriteLine("woman walk");
  }
}
```

## ジェネリクス
Swift

```swift
class Console
{
    open func PutMessage<T>(data: T)
    {
        print(data)
    }
}

var console = Console()
console.PutMessage(data: 3)
```

C#

```csharp
class Console
{
  public void PutMessage<T>(T data)
  {
    System.Console.WriteLine(data);
  }
}

Console console = new Console();
console.PutMessage("");
```

## 例外処理
Swift

```swift
// 例外の種類を列挙
enum HumanErrorType: Error
{
    case Unknow(String)
}

class Human
{
    fileprivate var name = ""

    init(name: String)
    {
        self.name = name
    }
    
    func putName() throws
    {
        guard self.name != "" else
        {
            throw HumanErrorType.Unknow("Human NonBlankName")
        }

        guard self.name.count > 1 else
        {
            throw HumanErrorType.Unknow("1LengthName or Less")
        }

        print(self.name)
    }
}

var bob = Human(name: "bob")
do
{
    defer
    {
        print("final")
    }
    try
        bob.putName()
}
catch HumanErrorType.Unknow(let message)
{
   print(message)
}
```

C#

```csharp
using System;

class Human
{
  private string name = "";

  public Human(string name)
  {
    this.name = name;
  }

  public void PutName()
  {
    if (this.name == "")
    {
      throw new Exception("Human NonBlnakName");
    }
    else if ( this.name.Length <= 1 )
    {
      throw new Exception("1LengthName or Less");
    }

    Console.WriteLine( this.name );
  }
}

try
{
   Human bob = new Human("bob");
   bob.PutName();
}
catch (Exception e)
{
  Console.WriteLine(e.Message);
}
finally
{
  Console.WriteLine("finale");
}
 ```