[Ios] كيف أقوم بربط أو دمج المصفوفات في Swift؟


Answers

باستخدام Swift 3 ، وفقًا لاحتياجاتك وأذواقك ، يمكنك اختيار إحدى الطرق الخمس التالية لربط / دمج صفيفين.

1. قم بدمج مصفوفين في مصفوفة جديدة مع مشغل Swift standard library +(_:_:) عام

تحدد مكتبة قياسية سريعة عامل تشغيل +(_:_:) عام. +(_:_:) لديه declaration التالي:

func +<RRC1 : RangeReplaceableCollection, RRC2 : RangeReplaceableCollection where RRC1.Iterator.Element == RRC2.Iterator.Element>(lhs: RRC1, rhs: RRC2) -> RRC1

ينشئ مجموعة جديدة عن طريق وصل عناصر مجموعتين.

يوضح رمز Playground التالي كيفية دمج صفيفين من النوع [Int] في صفيف جديد باستخدام +(_:_:) عامل تشغيل عام:

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = array1 + array2
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

2. إلحاق مصفوفة إلى مصفوفة أخرى مع append(contentsOf:) طريقة Array append(contentsOf:)

يحتوي Swift Array على أسلوب append(contentsOf:) . append(contentsOf:) يحتوي append(contentsOf:) على declaration التالي:

public mutating func append<S>(contentsOf newElements: S) where S : Sequence, S.Iterator.Element == Element)

يضيف عناصر تسلسل أو جمع إلى نهاية هذه المجموعة.

يعرض رمز Playground التالي كيفية إلحاق مصفوفة بمجموعة أخرى من النوع [Int] باستخدام أسلوب append(contentsOf:) :

var array1 = [1, 2, 3]
let array2 = [4, 5, 6]

array1.append(contentsOf: array2)
print(array1) // prints [1, 2, 3, 4, 5, 6]

3. دمج صفيفين في مصفوفة جديدة مع طريقة flatMap(_:)

يوفر Swift طريقة flatMap(_:) لكافة الأنواع التي تتوافق مع بروتوكول Sequence (بما في ذلك Array ). flatMap(_:) لديه declaration التالي:

func flatMap<SegmentOfResult : Sequence>(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]

إرجاع صفيف يحتوي على النتائج المتسلسلة لاستدعاء التحويل المحدد مع كل عنصر في هذا التسلسل.

يوضح رمز Playground التالي كيفية دمج صفيفين من النوع [Int] في صفيف جديد باستخدام flatMap(_:) :

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = [array1, array2].flatMap({ (element: [Int]) -> [Int] in
    return element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

4. قم بدمج مصفوفين في مصفوفة جديدة باستخدام طريقة Array 's init(_:) joined() و init(_:)

يوفر Swift طريقة joined() لكافة الأنواع التي تتوافق مع بروتوكول Sequence (بما في ذلك Array ). joined() لديه declaration التالي:

func joined() -> FlattenSequence<Self>

إرجاع عناصر هذا التسلسل من التسلسلات ، متسلسلة.

بالإضافة إلى ذلك ، يحتوي Swift Array على init(_:) مُهيئ. init(_:) لديه declaration التالي:

init<S : Sequence where S.Iterator.Element == Element>(_ s: S)

ينشئ مصفوفة تحتوي على عناصر التسلسل.

لذلك ، يوضح رمز Playground التالي كيفية دمج صفيفين من النوع [Int] في صفيف جديد باستخدام أسلوب init(_:) joined() و init(_:) initializer:

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenCollection = [array1, array2].joined() // type: FlattenBidirectionalCollection<[Array<Int>]>
let flattenArray = Array(flattenCollection)
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]

5. دمج صفيفين في مصفوفة جديدة مع reduce(_:_:) Array reduce(_:_:) الطريقة

يحتوي Swift Array على reduce(_:_:) الطريقة. reduce(_:_:) لديه declaration التالي:

func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result

إرجاع نتيجة استدعاء إغلاق الجمع المحدد مع كل عنصر في هذا التسلسل وقيمة التراكم.

يوضح رمز Playground التالي كيفية دمج صفيفين من النوع [Int] في صفيف جديد باستخدام reduce(_:_:) :

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]

let flattenArray = [array1, array2].reduce([], { (result: [Int], element: [Int]) -> [Int] in
    return result + element
})
print(flattenArray) // prints [1, 2, 3, 4, 5, 6]
Question

إذا كان هناك صفيفان تم إنشاؤهما بسرعة مثل:

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]

كيف يمكن دمجها مع [1, 2, 3, 4, 5, 6] ؟




إليك أقصر الطرق لدمج مصفوفتين.

 var array1 = [1,2,3]
 let array2 = [4,5,6]

تسلسل / دمجها

array1 += array2
New value of array1 is [1,2,3,4,5,6]



إذا كنت تريد إدراج المصفوفة الثانية بعد فهرس معين ، فيمكنك القيام بذلك (اعتبارًا من Swift 2.2):

let index = 1
if 0 ... a.count ~= index {
     a[index..<index] = b[0..<b.count]
}
print(a) // [1.0, 4.0, 5.0, 6.0, 2.0, 3.0] 



الطريقة المفضلة لدي منذ Swift 2.0 flatten

var a:[CGFloat] = [1, 2, 3]
var b:[CGFloat] = [4, 5, 6]

let c = [a, b].flatten()

سيؤدي ذلك إلى إرجاع FlattenBidirectionalCollection حتى إذا كنت تريد فقط أن يكون CollectionType كافياً وسيكون لديك تقييم كسول مجاناً. إذا كنت تحتاج بالضبط إلى "المصفوفة" ، فيمكنك القيام بذلك:

let c = Array([a, b].flatten())