Swift関連api機能の紹介と使用


一.Protocolのメソッドをmutating Swiftと宣言するプロトコルはclassタイプで実現できるだけでなくstructとenumにも適用できる.この理由は、他の人用のプロトコルに書く際にmutatingを用いてメソッドを修飾するかどうかを考慮する必要があるため、このキーワード修飾メソッドは、このメソッドの中国でstructとenumの変数を修正できるようにするためである.「だからプロトコル方法にmutatingを書かないと、structやenumでこのプロトコルを実現する人は、メソッドで自分の変数を変えることができません」.classを使用してmutating付きメソッドプロトコルを実現するには、具体的な実装方法の前にmutatingの修飾を加える必要はありません.
二.Sequence Swiftのfor inは、Sequenceを実装したすべてのタイプで使用することができ、Sequenceを実装するには、まずIteratorProtocolを実装する必要がある.
//         IteratorProtocol  class
class ReverseIterator: IteratorProtocol {
    //IteratorProtocol      typealias Element
    typealias Element = T
    var array: [Element]
    var currentIndex = 0
    
    init(array: [Element]) {
        self.array = array
        currentIndex = array.count - 1
    }
    
    //      Element?    next()
    func next() -> T? {
        if currentIndex < 0{
            return nil
        } else {
            let element = array[currentIndex]
            currentIndex -= 1
            return element
        }
    }
}

//           Sequence  class
struct ReverseSequence: Sequence {
    //  IteratorProtocol    ,         typealias
    typealias Iterator = ReverseIterator
    
    var array: [T]
    init(array: [T]) {
        self.array = array
    }
    
    //      ReverseIterator makeIterator
    func makeIterator() -> ReverseIterator {
        return ReverseIterator(array: self.array)
    }
}


次のように使用します.
 var arr = [10, 11, 12, 13, 14]
 for (i, _) in ReverseSequence.init(array: arr).enumerated() {
            print("Index\(i) is \(arr[i])")
 }
 

三.多重グループはswiftにおいて、戻り値は複数の値を含むことができる.
四.@autoclosure??swiftで閉パッケージの使い方を簡単に書くことができます.
logIfTrue({
     return 2 > 1})       logIfTrue({2 > 1})

Autoclosureとは、式を自動的に閉じたパッケージにカプセル化することです.
func logIfTrue(_ predicate:@autoclosure () -> Bool) {
   if predicate() {
       print(true)
    }
 }

使用するときはlogIfTrue(2>1)と書くだけで、{}も省略できます.swiftは2>1という式を自動的に()->Boolに変換します.
Swiftには、非常に有用なオペレータ???があります.nilの条件判断をすばやく行うことができ、1つのオブジェクトが??を使用する場合、Intタイプのように、実際には1つの()->Intにカプセル化されます
func ??(optional: T?, defaultValue: @autoclosure () -> T) -> T {
     switch optional {
     case .Some(let value):
          return value
      case .None:
        return defaultValue()
      }
 }

ここではautoclosureパッケージを1つ使いました()->T、autoclosureがなければ???オペレータが本当に値を取る前にデフォルト値を用意してこのメソッドに転送する必要はありません.実際にはこのデフォルト値を使用していません.optionalのパケット解除後の値を直接返します.これにより、デフォルト値の計算をoptionalがnilと判定した後に遅らせる必要があります.これにより、不要なオーバーヘッドを回避できます.優雅な書き方はoptionalおよびデフォルト値の値を取ります.@autoclosureでは入力パラメータ付きの書き方はサポートされていません.
五.@escaping
 func doWorkAsync(block: @escaping ()->()) {
        DispatchQueue.main.async {
            block()
        }
    }

閉包前に@escapingを付けて、この閉包がこの方法から逃れることを明記します.親クラスまたはプロトコルで@escapingをパラメータとして受け入れる方法が定義されている場合、プロトコルの実装またはサブクラスでも@escapingを加える必要があります.そうしないと、異なる方法とみなされます.
六.字面量表現swiftは非常に興味深いプロトコルのセットを提供し、字面量を用いて特定のタイプを表現し、字面量表現プロトコルを実現したタイプは、値を付与する際にプロトコル方法で定義された規則に従って「シームレスに対応」して値を付与することによって対応タイプとして簡単に表現することができ、実際に開発された字面量プロトコル:
ExpressibleByArrayLiteral
ExpressibleByBooleanLiteral
ExpressibleByDictionaryLiteral
ExpressibleByFloatLiteral
ExpressibleByNilLiteral
ExpressibleByNilLiteral

すべての字面量はtypealiasと対応するinitメソッドを定義している.
七.初期メソッドの順序がObjcと異なるのは、Swiftの初期メソッドは、タイプのすべてのプロパティが初期化されたことを保証してから親の初期化メソッドを呼び出す必要があることである.最後に必要であれば、親の変更が必要なプロパティを再割り当てする.swiftでlet宣言された定数を割り当てることができることに注意すべきである.
八.defaultパラメータswiftのメソッドは、デフォルトパラメータをサポートします.すなわち、メソッドを宣言するときにパラメータにデフォルト値を与えることができます.NSLocalizedStringはその例です.
func sayHello1(str1: String = "Hello", str2: String, str3: String) {
    print(str1 + str2 + str3)
}

九.AnyClass,メタタイプ,.selfはAnyObject.Typeという方法で得られたメタタイプ(Meta),A.TypeはAタイプを表す.
class A {
}

let typeA: A.Type = A.self

.selfは、タイプの後にタイプ自体を取得するために使用できます.たとえば、register cellのclassでこのメタタイプを使用することがよくあります.
十.属性観察属性観察(Property Observers)はSwiftの特殊な特性であり、属性観察を利用して現在のタイプ内で属性の設定を監視し、いくつかの応答を行うことができる.SwiftではwillSetとdidSetの2つの属性観察方法を提供している.
var date: NSDate {
    willSet {
        let d = date
        print("       \(d)     \(newValue)")
    }
    
    didSet {
        print("       \(oldValue)     \(date)")
    }
}

計算属性と観察属性は共存できないことに注目すべきである.
十一.Optional MapはswiftでArrayに対してMapの操作を使用することができ、この方法は配列中のすべての要素にある規則を適用することができ、CollectionType(Arrayがこのプロトコルを遵守している)のExtensionでこの方法の定義を見つけることができる.
extension CollectionType {
    public func map(@noescape transform: 
                    (Self.Generator.Element) -> T) -> [T]
}


上記のコードから、swiftではプロトコルの拡張がサポートされていることがわかります.同様にOptionalにも同様のmapがあります.
public enum Optional : _Reflectable, NilLiteralConvertible {
    /// If `self == nil`, returns `nil`.  Otherwise, returns `f(self!)`.
    public func map(@noescape f: (T) -> U) -> U?

}

この方法は1つのoptional値を簡単に変化させ、操作することができ、手動の解包作業に及ばない.入力は自動的にOptinal Bindingのような方法で判断される.これらはすべてFunctorの概念に合っている.
十二.Swiftコマンドラインツールはswiftを直接使用して.swiftのファイルを実行することができ、swift--help、swift--helpで見ることができ、Swiftコマンドラインツールのもう一つの一般的な場所はXcode環境から直接離れてコンパイルし、実行可能なファイルを生成することである.
swiftc -O test.swift -o test..asm

十三.Filterの一般的な動作は、配列を検査し、その配列の一定の条件に合致する要素をフィルタし、 を作成することである.
let nums = [2,4,5,6,7,8,9,10]
let filers = nums.filter { $0 % 2 == 0 }
print(filers)

swiftのArrayとDictionaryの各要素は$0で簡単に書くことができ、mapとfilterを組み合わせることで、中間配列を導入する必要がなく、多くの配列操作を簡単に行うことができます.
filterの実装はmapと似ているように見えます.
extension Array {
    func filter(_ isIncluded: (Element) -> Bool) -> [Element] {
        var result: [Element] = []
        for x in self where isIncluded(x) {
            result.append(x)
        }
        return result
    }
}

配列に条件を満たす要素があるかどうかを検索するだけであれば、性能的にはfilterを使用する必要はありませんが、containsを使用することができます.一般的には、すべての結果が必要な場合にfilterを使用します.
14.reduce mapとfilterは配列に作用し、新しい修正された配列を生成しますが、すべての新しい要素を新しい値に組み合わせたい可能性があります.
let total = nums.reduce(0, +)

次のようにreduceの実装を行います.
extension Array {
    func reduce(_ initialResult: Result,
                        _ nextPartialResult: (Result, Element) -> Result) -> Result
    {
        var result = initialResult
        for x in self {
            result = nextPartialResult(result, x)
        }
        return result
    }
}

十五.集合タイププロトコル1.シーケンスSequenceプロトコルは集合タイププロトコルの基礎であり、一つのシーケンスは一連の同じタイプの値を表し、一つのシーケンスを遍歴する最も簡単な方法はforループである.Sequenceプロトコルを満たすのは非常に簡単であり、反復器を返すmakeIterator()方法を提供することであり、例えば最初の例である.2.集合タイプ集合タイプ(Collection)は、複数回にわたって一貫性を保つ安定したシーケンスを指します.Collectionプロトコルは、履歴書がSequenceの上にあり、Sequenceからすべての方法を継承するだけでなく、countのような新しい機能も提供します.
転載先:https://juejin.im/post/5b597c72f265da0f51406839