3
3

More than 5 years have passed since last update.

Swift vs C# : Strings and Characters

Last updated at Posted at 2014-09-28

String Literals

 26> var a =  "Swift" + 
 27.          "\nMultiline Literal"
a: String = "Swift\nMultiline Literal"
 28> println(a)
Swift
Multiline Literal
csharp> var x = "C#\nLiteral";
csharp> x
"C#
Literal"
csharp> var y = @"C#\nLiteral";
csharp> y
"C#\nLiteral"
csharp> var y = @"C#
      > Literal";
csharp> y
"C#
Literal"
csharp> var a = @"  
      > C# 
      > Multiline
      > Literals
      > "
csharp> a
"
C# 
Multiline
Literals
"

Initializing an Empty String

 29> var s=String()
s: String = ""
 30> s.isEmpty
$R11: Bool = true
csharp> var s="";
csharp> string.IsNullOrEmpty(s);
true

String Mutability

  • ここで言っているのは let の変数は変更出来ないよということでしょう
  • C# : String は immutable, StringBuilderはmutable
  • Objective-C : NSString(immutable), NSMutableString(mutable)
  • Swift: StringはNSString APIにバインドされているようだからimmutableなんじゃないんでしょうか。。。

Strings Are Value Types

Swift:

  • ひょっとして、Stringは実はmutableなのか?
  • 関数呼び出しの際にも "copy-by-default" する
  • "copy-by-default"というのはコピーしないこともある、ということ。オプティマイザがコピーするかしないかを判断する模様

C#:

  • String オブジェクトは、文字列を表す System.Char オブジェクトのシーケンシャル コレクションです。
  • String オブジェクトの値はシーケンシャル コレクションの内容であり、この値は変更できません (つまり、読み取り専用です)。
  • 文字列の不変性に関する詳細については、このトピックの 不変性と Stringbuilder クラス セクションを後で参照します。
  • メモリの String オブジェクトの最大サイズは 2 GB、約 10億文字です。

Working with Characters

  7> for i in "Funkadelic" { print("\(i)-") }; println("")
F-u-n-k-a-d-e-l-i-c-
csharp> foreach(var i in "Funkadelic"){ Console.Write(String.Format("{0}-",i));}; Console.WriteLine();
F-u-n-k-a-d-e-l-i-c-
  • Swift: StringをArrayに変換しないと...
  9> Array("Funkadlic")[0]
$R2: Character = "F"
  • C#: もともと Array of System.Char
csharp> "Funkadelic"[0] 
'F'

Concatenating Strings and Characters

 21> var msg = "Good Morning"
msg: String = "Good Morning"
  • Swift: Character をappendできる(mutable?)
 25> msg.append(Array("!")[0])
 26> msg
$R7: String = "Good Morning!"
  • UnicodeScalarとCharacterはappendできるけど、"!"だとどっちの型かわからん、ということ (> <)
 27> msg.append("!")
/var/folders/3n/0lk686q1129clzkw38blpwdc0000gp/T/lldb/6778/repl63.swift:2:1: error: ambiguous use of 'append'
msg.append("!")
^
Swift.String:3:17: note: found this candidate
  mutating func append(x: UnicodeScalar)
                ^
Swift.String:7:17: note: found this candidate
  mutating func append(c: Character)
                ^
 27> UnicodeScalar("!")
$R8: (UnicodeScalar) = U+0x00000021 U'!'
 28> msg.append(UnicodeScalar("!"))
 29> msg
$R9: String = "Good Morning!!"
  • C#: String はimmutableなので、追加というのは別途連結したString作成してそれに参照を変えるという事
  • StringBuilderで固定のバッファに処理をできる(mutable)
csharp> var msg = new StringBuilder(100);
csharp> msg.Append("Good Morning")
Good Morning
csharp> msg.Append("!")
Good Morning!
csharp> msg.ToString()
"Good Morning!"

String Interpolation

 30> var x=0, y=1, z=2
x: Int = 0
y: Int = 1
z: Int = 2
 31> "\(x) + \(y) + \(z) = \(x+y+z)"
$R10: String = "0 + 1 + 2 = 3"
 32> func sum(i:Int,j:Int,k:Int)->Int{ return i + j + k }
 33> sum(1,2,3)
$R11: Int = 6
 34> "\(x) + \(y) + \(z) = \(sum(x,y,z))"
$R12: String = "0 + 1 + 2 = 3"
csharp> Func<int,int,int,int> sum = (i,j,k) => { return i + j + k; }
csharp> sum(0,1,2)
3

csharp> var i=0; var j=1; var k=2;
csharp> String.Format("{0} + {1} + {2} = {3}", i,j,k,sum(i,j,k)); 
"0 + 1 + 2 = 3"

Unicode

Unicode Scalars

 40> "\u{0061}"
$R15: String = "a"
 41> "\u{1F496}" 
$R16: String = "?"
csharp> "\u0061"    
"a"
csharp> '\u0061'
'a'
csharp> "\u1f496" 
"Ὁ6"
 42> println("\"Apple\"")
"Apple"
csharp> Console.WriteLine("\"Apple\"");
"Apple"
csharp> Console.WriteLine(@"""Apple""");
"Apple"

Extended Grapheme Clusters

  • 拡張書記素クラスタ

An extended grapheme cluster is a sequence of one or more Unicode scalars that (when combined) produce a single human-readable character.

書記素クラスタ〔grapheme cluster〕は、Unicode文字の列で、ひとつの書記素基底〔grapheme base〕と、付加的な書記素エキステンダ〔grapheme extender〕および/または「前置」文字〔“prepend” character〕から成る。これは人が「文字」とみなすものに近い。

In general, these combinations—surrogate pairs, base characters plus combining marks, Hangul jamo, and Indic consonant clusters—are referred to as grapheme clusters.

Counting Characters

 43> countElements("Supergroovalisticprosifunkstication")
$R17: Int = 35
csharp> "Supergroovalisticprosifunkstication".Length
35

Comparing Strings

String and Character Equality

  • Swift : == , !=
csharp> var a = "Funky"
csharp> var b = "Funky"
csharp> a == b
true
csharp> a != b
false
csharp> a.CompareTo(b)
0
csharp> string.CompareOrdinal(a,b)
0
csharp> a.SequenceEqual(b)
true

Prefix and Suffix Equality

 44> "Act 2 Scene 2: Capulet's orchard".hasPrefix("Act 2")
$R18: Bool = true

 45> "Act 2 Scene 2: Capulet's orchard".hasSuffix("orchard") 
$R19: Bool = true
csharp> "Act 2 Scene 2: Capulet's orchard".StartsWith("Act 2")
true

csharp> "Act 2 Scene 2: Capulet's orchard".EndsWith("orchard") 
true

Unicode Representations of Strings

UTF-8, UTF-16 Representation

 46> "Supergroovalisticprosifunkstication".utf8
$R20: String.UTF8View = {
  _core = {
    _baseAddress = 0x0000000102876b60
    _countAndFlags = 9223372036854775843
    _owner = nil
  }
}
 47> "Supergroovalisticprosifunkstication".utf16
$R21: String.UTF16View = {
  _offset = 0
  _length = 35
  _core = {
    _baseAddress = 0x0000000102876d60
    _countAndFlags = 9223372036854775843
    _owner = nil
  }
}
csharp> System.Text.Encoding.UTF8.GetBytes("Supergroovalisticprosifunkstication")
{ 83, 117, 112, 101, 114, 103, 114, 111, 111, 118, 97, 108, 105, 115, 116, 105, 99, 112, 114, 111, 115, 105, 102, 117, 110, 107, 115, 116, 105, 99, 97, 116, 105, 111, 110 }

csharp> System.Text.Encoding.GetEncoding("UTF-16").GetBytes("Supergroovalisticprosifunkstication")
{ 83, 0, 117, 0, 112, 0, 101, 0, 114, 0, 103, 0, 114, 0, 111, 0, 111, 0, 118, 0, 97, 0, 108, 0, 105, 0, 115, 0, 116, 0, 105, 0, 99, 0, 112, 0, 114, 0, 111, 0, 115, 0, 105, 0, 102, 0, 117, 0, 110, 0, 107, 0, 115, 0, 116, 0, 105, 0, 99, 0, 97, 0, 116, 0, 105, 0, 111, 0, 110, 0 }

Unicode Scalar Representation

 49> "Supergroovalisticprosifunkstication".unicodeScalars
$R23: String.UnicodeScalarView = {
  _core = {
    _baseAddress = 0x00000001028791b0
    _countAndFlags = 9223372036854775843
    _owner = nil
  }
}

 51> for i in "Supergroovalisticprosifunkstication".unicodeScalars { print("\(i.value)-")} ; println(""); 
83-117-112-101-114-103-114-111-111-118-97-108-105-115-116-105-99-112-114-111-115-105-102-117-110-107-115-116-105-99-97-116-105-111-110-

csharp> System.Text.Encoding.UTF8.GetBytes("Supergroovalisticprosifunkstication")
{ 83, 117, 112, 101, 114, 103, 114, 111, 111, 118, 97, 108, 105, 115, 116, 105, 99, 112, 114, 111, 115, 105, 102, 117, 110, 107, 115, 116, 105, 99, 97, 116, 105, 111, 110 }

csharp> foreach(var i in "Supergroovalisticprosifunkstication"){ Console.Write(string.Format("{0}-",(byte)i));}
83-117-112-101-114-103-114-111-111-118-97-108-105-115-116-105-99-112-114-111-115-105-102-117-110-107-115-116-105-99-97-116-105-111-110-
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3