2 Basic Operators基本オペレータ

9871 ワード

演算子は、値のチェック、変更、または組み合わせに使用される特殊な記号またはフレーズです.たとえば、加算演算子(+)はlet i=1+2などの2つの数値を追加し、論理演算子(&)はif enteredDoorCode&&passedRetinaScanなどの2つのブール値を組み合わせます.
Swiftはほとんどの標準のCオペレータをサポートし、一般的な符号化エラーを解消するためにいくつかの機能を改善しました.代入演算子(=)は、equal to演算子(=)の使用中に誤って使用されないように値を返さない.算術演算子(+、-、*、/、%など)は、値のオーバーフローを検出および禁止し、格納されているタイプの許容値の範囲より大きい値または小さい値を処理するときに予期しない結果が発生しないようにします.Overflow Operatorsで説明したように、Swiftのオーバーフローオペレータを使用してオーバーフロー動作を評価できます.
Swiftはまた、a.<などのC言語にない範囲オペレータを提供しています.bとa...は値範囲を表すショートカットとして用いられる.
この章では、Swiftの一般的なオペレータについて説明します.Advanced Operatorsには、Swiftの高度な演算子が含まれており、独自のカスタム演算子を定義する方法と、独自のカスタムタイプの標準演算子を実装する方法について説明します.
Terminology用語
演算子には、1元、2元、または3元があります.
  • 一元演算子は、1つのターゲット(たとえば-a)のみを操作します.一元接頭辞オペレータはターゲットの直前(例えば!b)、一元接尾辞オペレータはターゲットの直後(例えばc!)である.
  • バイナリオペレータは、2つのターゲット(例えば2+3)を操作し、2つのターゲット間に現れるため、接尾辞である.
  • 三元オペレータは、3つのターゲットを操作します.C言語と同様に、Swiftには3元演算子(a?b:c)が1つしかありません.

  • オペレータが影響する値はオペランドです.式1+2では、+記号はバイナリオペレータであり、2つのオペランドは値1と2です.
    Assignment Operator割付演算子
    代入演算子(a=b)は、bの値でaの値を初期化または更新する.
    let b = 10
    var a = 5
    a = b
    // a = 10
    

    割り当てられた値の右側に複数の値を持つメタグループがある場合、その要素は同時に複数の定数または変数に分解できます.
    let (x, y) = (1, 2)
    // x=1, y=2
    

    CおよびObjective-Cの割り当てオペレータとは異なり、Swiftの割り当てオペレータ自体は値を返さない.以下の説明は無効です.
    if x = y {
      ...
    }
    

    このプロパティを使用すると、割り当てオペレータ(=)が実際に使用されている場合に予期せぬ使用を防止できます.if x=yを無効にすることで、Swiftはコード内のこのようなエラーを回避できます.
    Arithmetic Operators演算子
    Swiftは、すべての数値タイプの4つの標準演算子をサポートします.
  • プラス(+)
  • マイナス(-)
  • 乗(*)
  • 除(/)
  • 1 + 2       // equals 3
    5 - 3       // equals 2
    2 * 3       // equals 6
    10.0 / 2.5  // equals 4.0
    

    CおよびObjective-Cの演算子とは異なり、Swift演算子のデフォルトでは値オーバーフローは許可されません.Swiftのオーバーフローオペレータ(a&+bなど)を使用してオーバーフロー動作を評価できます.
    加算演算子は文字列接続もサポートします.
    "hello, " + "world"  // equals "hello, world"
    

    Remainder Operator剰余演算子
    剰余演算子(a%b)は、aにおけるbの倍数を算出し、残りの値(剰余と呼ぶ)を返す.
    注:剰余演算子(%)は、他の言語でもモジュール演算子と呼ばれます.しかし、負の数でのSwift挙動は、厳密には、モード演算ではなく余剰数であることを意味する.
    Unary Minus Operator一元-オペレータ
    数値の記号は接頭辞-を使用して切り替えることができます.これを1元減算演算子と呼びます.
    let three = 3
    let minusThree = -three       // minusThree equals -3
    let plusThree = -minusThree   // plusThree equals 3, or "minus minus three"
    

    単項マイナス記号演算子(-)直接接頭辞は、その値が作用する前にスペースがありません.
    Unary Plus Operator
    一元+オペレータ
    let minusSix = -6
    let alsoMinusSix = +minusSix  // alsoMinusSix equals -6
    

    1元プラス記号演算子は実際には何もしませんが、負の数に対しても1元マイナス記号演算子を使用する場合は、コード内で正の数に対称性を提供することができます.
    複合代入オペレータ
    C言語と同様に、Swiftは、割り当て(=)を別の操作と組み合わせた複合割り当てオペレータを提供します.1つの例は、加算代入演算子(+=):
    var a = 1
    a += 2
    // a is now equal to 3
    

    式a+=2は、a=a+2の略語である.実際には、加算と割り当ては、2つのタスクを同時に実行するオペレータに統合されます.
    注:複合付与オペレータは値を返しません.例えば、b=a+=2にすることはできません.
    Swift標準ライブラリで提供されるオペレータについては、Operator Declarationsを参照してください.
    Comparison Operators比較演算子
  • は(a==b)
  • に等しい
  • (a!=b)
  • に等しくない
  • は(a>b)
  • より大きい
  • より小さい(a
  • 以上(a>=b)
  • 以下(a<=b)
  • 注意:Swiftには、2つのオブジェクト参照が同じオブジェクトインスタンスを同時に参照するかどうかをテストする2つの識別子(==および!=)も用意されています.
    各比較演算子は、文が真であるかどうかを示すBool値を返します.
    1 == 1   // true because 1 is equal to 1
    2 != 1   // true because 2 is not equal to 1
    2 > 1    // true because 2 is greater than 1
    1 < 2    // true because 1 is less than 2
    1 >= 1   // true because 1 is greater than or equal to 1
    2 <= 1   // false because 2 is not less than or equal to 1
    

    比較演算子はif文などの条件文でよく使用されます.
    let name = "world"
    if name == "world" {
        print("hello, world")
    } else {
        print("I'm sorry \(name), but I don't recognize you")
    }
    // Prints "hello, world", because name is indeed equal to "world".
    

    2つのメタグループが同じタイプと同じ数の値を持っている場合は、それらを比較できます.メタグループを左から右に比較し、2つの等しくない値が比較されるまで、各値を比較します.この2つの値を比較し,比較の結果はメタグループ比較の全体的な結果を決定した.すべての要素が等しい場合、メタグループ自体も等しい.例:
    (1, "zebra") < (2, "apple")   // true because 1 is less than 2; "zebra" and "apple" are not compared
    (3, "apple") < (3, "bird")    // true because 3 is equal to 3, and "apple" is less than "bird"
    (4, "dog") == (4, "dog")      // true because 4 is equal to 4, and "dog" is equal to "dog"
    

    オペレータが各メタグループの各値に適用できる場合にのみ、メタグループを指定したオペレータと比較できます.たとえば、次のコードに示すように、タイプ(String,Int)の2つのメタグループを比較できます.
    ("blue", -1) < ("purple", 1)        // OK, evaluates to true
    ("blue", false) < ("purple", true)  // Error because < can't compare Boolean values
    

    注意:Swift標準ライブラリには7要素未満のメタグループ比較が含まれています.メタグループ要素が7以上の場合、比較が必要な場合は、自分で比較オペレータを実装する必要があります.
    Ternary Conditional Operator三元条件演算子
    question ? answer 1:answer 2 questionが真の場合、answer 1を計算し、その値を返します.そうでなければ、answer 2を計算し、その値を返します.
    三元条件演算子は、次のコードの略です.
    if question {
        answer1
    } else {
        answer2
    }
    

    次の例では、テーブル行の高さを計算します.行にタイトルがある場合は、行の高さは内容より50ポイント高いはずです.見出しがなければ、行の高さは20:
    let contentHeight = 40
    let hasHeader = true
    let rowHeight = contentHeight + (hasHeader ? 50 : 20)
    // rowHeight is equal to 90
    

    上の例は、次のコードの略です.
    let contentHeight = 40
    let hasHeader = true
    let rowHeight: Int
    if hasHeader {
        rowHeight = contentHeight + 50
    } else {
        rowHeight = contentHeight + 20
    }
    // rowHeight is equal to 90
    

    最初の例が三元条件演算子を使用すると、rowHeightは2番目の例で使用したコードよりも簡潔な1行のコードで正しい値に設定できることを意味します.
    三元条件演算子は、どの式を考慮するかを決定するために有効な簡略化を提供します.ただし、三元条件演算子の使用には注意してください.使いすぎると、その簡潔さが読みにくいコードになる可能性があります.三元条件演算子の複数のインスタンスを複合文に結合しないでください.
    Nil-Coalescing Operator nil集約演算子
    nil集約演算子(a??b)オプションタイプaに値がある場合は、その展開値を返し、aがnilの場合はbを返し、式aは常にオプションタイプである.式bは、aに格納されているタイプと一致しなければならない.
    nil集約演算子は、次のコードの略です.
    a != nil ? a! : b
    

    注意:aの値がnilでない場合、bの値は計算されません.これがいわゆる短絡計算である.
    次の例では、nil集約演算子を使用して、デフォルトの色名とオプションのユーザー定義色名の間で選択します.
    let defaultColorName = "red"
    var userDefinedColorName: String?   // defaults to nil
    
    var colorNameToUse = userDefinedColorName ?? defaultColorName
    // userDefinedColorName is nil, so colorNameToUse is set to the default of "red"
    

    userDefinedColorNameにNull以外の値を割り当て、nil-coalescingオペレータチェックを再度実行する場合は、デフォルトではなくuserDefinedColorNameにパッケージされた値を使用します.
    userDefinedColorName = "green"
    colorNameToUse = userDefinedColorName ?? defaultColorName
    // userDefinedColorName is not nil, so colorNameToUse is set to "green"
    

    Range Operators区間演算子
    Swiftには、値の範囲を表すショートカットであるいくつかの範囲オペレータが含まれています.
    Closed Range Operator閉区間演算子
    閉区間演算子(a...b)は、値aおよびbを含むaからbまでの範囲を定義する.aの値はbより大きくしてはならない.
    閉区間演算子は、for-inループなど、すべての値を使用する範囲を巡回する場合に便利です.
    for index in 1...5 {
        print("\(index) times 5 is \(index * 5)")
    }
    // 1 times 5 is 5
    // 2 times 5 is 10
    // 3 times 5 is 15
    // 4 times 5 is 20
    // 5 times 5 is 25
    

    Half-Open Range Operator半開区間演算子
    半開区間演算子(a.
    半開区間演算子は、ゼロから始まるリスト(配列など)を処理するときに特に役立ち、配列内のリストの長さ(含まない)を計算するのに役立ちます.
    let names = ["Anna", "Alex", "Brian", "Jack"]
    let count = names.count
    for i in 0..

    配列には4つの項目が含まれていますが、下付きの値は0から始まります.
    One-Sided Ranges片側区間演算子
    区間は一度に制限され、反対側はすべての一致する値に達します.
    for name in names[2...] {
        print(name)
    }
    // Brian
    // Jack
    
    for name in names[...2] {
        print(name)
    }
    // Anna
    // Alex
    // Brian
    
    for name in names[..<2] {
        print(name)
    }
    // Anna
    // Alex
    

    片側区間は、下付き文字だけでなく、他のコンテキストで使用できます.反復がどこから始まるべきか分からないため、最初の値を無視した片側区間で反復することはできません.最終値を無視した片側区間で反復できます.ただし、範囲が無限に続くため、ループに明示的な終了条件が追加されていることを確認してください.次のコードに示すように、片側範囲に特定の値が含まれているかどうかを確認することもできます.
    let range = ...5
    range.contains(7)   // false
    range.contains(4)   // true
    range.contains(-1)  // true
    

    Logical Operators論理演算子
    論理演算子は、ブール論理値trueとfalseを変更または組み合わせます.Swiftは、c言語ベースの3つの標準論理オペレータをサポートします.
  • 論理非(!a)
  • 論理は(a&&b)aとbと同時にtrueであり、true
  • に戻る.
  • 論理または(a|b)または、1つが満たされる限りtrue
  • に戻る
    論理非演算子
    論理NOTオペレータは、操作する値の前にスペースがない接頭辞オペレータです.次の例を示します.
    let allowedEntry = false
    if !allowedEntry {
        print("ACCESS DENIED")
    }
    // Prints "ACCESS DENIED"
    

    論理と演算子
    let enteredDoorCode = true
    let passedRetinaScan = false
    if enteredDoorCode && passedRetinaScan {
        print("Welcome!")
    } else {
        print("ACCESS DENIED")
    }
    // Prints "ACCESS DENIED"
    

    論理演算子
    let hasDoorKey = false
    let knowsOverridePassword = true
    if hasDoorKey || knowsOverridePassword {
        print("Welcome!")
    } else {
        print("ACCESS DENIED")
    }
    // Prints "Welcome!"
    

    組合せ論理演算子
    複数の論理演算子を組み合わせて、より長い複合式を作成できます.
    if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
        print("Welcome!")
    } else {
        print("ACCESS DENIED")
    }
    // Prints "Welcome!"
    

    注意:Swift論理演算子&&||は左に関連付けられており、これは複数の論理演算子を持つ複合式が最初に一番左のサブ式を計算することを意味します.
    Explicit Parentheses明確なかっこ
    カッコを厳密に必要としない場合には、カッコを追加することが役立ち、複雑な式の意図を読みやすくすることができます.上記のdoor accessの例では、複合式の第1の部分に括弧を付けることが役に立ち、明示的に示すことができます.
    if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
        print("Welcome!")
    } else {
        print("ACCESS DENIED")
    }
    // Prints "Welcome!"
    

    括弧は,最初の2つの値が論理全体にわたって独立した可能な状態の一部と考えられることを明確に示した.複合式の出力は変化しないが,全体的な意図は読者にとってより明確である.可読性は常に簡潔さより優先される.カッコであなたの意図を明確にするのを助けます.
    <