সম্পত্তির মান অনুসারে কাস্টম অবজেক্টগুলির অ্যারে কীভাবে সাজানো যায় তা স্যুইফ্ট করুন


518

আসুন আমরা আমাদের ইমেজফিল নামে একটি কাস্টম ক্লাস রাখতে পারি এবং এই শ্রেণিতে দুটি বৈশিষ্ট্য রয়েছে।

class imageFile  {
    var fileName = String()
    var fileID = Int()
}

তাদের অনেকগুলি অ্যারেতে সঞ্চিত

var images : Array = []

var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)

aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)

প্রশ্নটি: আমি কীভাবে 'ফাইলআইডি' এএসসি বা ডিইএসসি দ্বারা চিত্রগুলি অ্যারে বাছাই করতে পারি?


সাজানোর KeyPath দ্বারা stackoverflow.com/a/46601105/2303865
লিও Dabus

উত্তর:


938

প্রথমে আপনার অ্যারেটিকে টাইপ করা অ্যারে হিসাবে ঘোষণা করুন যাতে আপনি পুনরাবৃত্তি করার সময় পদ্ধতিগুলিতে কল করতে পারেন:

var images : [imageFile] = []

তারপরে আপনি সহজভাবে এটি করতে পারেন:

সুইফট 2

images.sorted({ $0.fileID > $1.fileID })

সুইফট 3+

images.sorted(by: { $0.fileID > $1.fileID })

উদাহরণটি দেয় নিম্নক্রমে সাজানোর ক্রম


1
আমি অ্যারে ঘোষণার অংশটি অনুপস্থিত ছিল, এটি অ্যারে <ইমেজফাইলে> কৌশলটি করেছে।
mohacs

1
@ অ্যালেক্সওয়াইন আমার কাছে চেকআইএনএন্ডআউট NSManagedObjectনামে একটি সাবক্লাস রয়েছে । এবং একটি পৃথক ফাইলে, আমি এই ধরণের অবজেক্টগুলির জন্য একটি টাইপযুক্ত অ্যারে ঘোষণা করেছি এবং যখন আমি এটি বাছাই করার চেষ্টা করি তখন আমি সদস্য ত্রুটি খুঁজে পাইনি get কোন ধারণা কেন এটি?
ইসুরু

3
আমি আমার সমস্যা খুঁজে পেয়েছি। স্পষ্টতই অ্যারে টাইপ করা অ্যারে ছিল না। যাইহোক আমার একটি নতুন সমস্যা আছে। আমি একাধিক বৈশিষ্ট্য দ্বারা কিভাবে একটি অ্যারে বাছাই করতে পারি? বলুন যে আমার কাছে 2 টি বৈশিষ্ট্য রয়েছে যেমন firstNameএবং lastNameঅ্যারেজ Personঅবজেক্টস। প্রথমে আমি এটি firstNameপরে এবং পরে বাছাই করতে চাই lastName। আমি কীভাবে এটি করতে পারি?
ইসুরু

12
তোমার এখন কি দরকার images.sortInPlace({ $0.fileID > $1.fileID })?
টেলর এম

13
যদি কেউ একই প্রশ্ন করে থাকে: উত্তরটি ডেস্ক অর্ডার দেবে
ড্যানি ওয়াং

223

[ বাছাই সহ সুইফট 3-এর জন্য আপডেট করা হয়েছে :) এর মাধ্যমে, এটি পিছনে বন্ধের শোষণ করে:

images.sorted { $0.fileID < $1.fileID }

যেখানে আপনি যথাক্রমে ASC বা DESC ব্যবহার করেন <বা >নির্ভর করে। আপনি যদি imagesঅ্যারেটি সংশোধন করতে চান তবে নিম্নলিখিতগুলি ব্যবহার করুন:

images.sort { $0.fileID < $1.fileID }

আপনি যদি বার বার এটি করতে যাচ্ছেন এবং কোনও ফাংশন সংজ্ঞায়িত করতে পছন্দ করেন তবে একটি উপায় হ'ল:

func sorterForFileIDASC(this:imageFile, that:imageFile) -> Bool {
  return this.fileID > that.fileID
}

এবং তারপরে ব্যবহার করুন:

images.sort(by: sorterForFileIDASC)

আমি স্ট্রিং দিয়ে কীভাবে এই মামলা করতে পারি? আমার তার দৈর্ঘ্য অনুসারে স্ট্রিংটি বাছাই করতে হবে
মুনিফ এম

@MuneefM শুধু string1.length <আসতে string2.length
Surjeet রাজপুত

sortএক্সকোড ৮-এ এই সিনট্যাক্সটি আর সংকলন $0.fileID < $1.fileIDকরে না X
ক্রশলোট

3
এই উত্তরটির কোডটি Xcode8 এ সূক্ষ্মভাবে কাজ করে; যদি আপনার কোনও ত্রুটি হয় তবে একটি নতুন প্রশ্ন পোস্ট করুন।
GoZoner

আমি কি এটি তুলনা অনুসারে বাছাই করতে ব্যবহার করতে পারি, উদাহরণস্বরূপ সপ্তাহের দিনগুলিতে অ্যারে বাছাই করা? যদি তাই হয়, কিভাবে?
ক্রিস্টোফার

53

প্রায় প্রত্যেকে প্রত্যক্ষভাবে দেয় যে আমাকে কীভাবে বিবর্তন দেখায়:

আপনি অ্যারের উদাহরণ পদ্ধতি ব্যবহার করতে পারেন:

// general form of closure
images.sortInPlace({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })

// types of closure's parameters and return value can be inferred by Swift, so they are omitted along with the return arrow (->)
images.sortInPlace({ image1, image2 in return image1.fileID > image2.fileID })

// Single-expression closures can implicitly return the result of their single expression by omitting the "return" keyword
images.sortInPlace({ image1, image2 in image1.fileID > image2.fileID })

// closure's argument list along with "in" keyword can be omitted, $0, $1, $2, and so on are used to refer the closure's first, second, third arguments and so on
images.sortInPlace({ $0.fileID > $1.fileID })

// the simplification of the closure is the same
images = images.sort({ (image1: imageFile, image2: imageFile) -> Bool in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in return image1.fileID > image2.fileID })
images = images.sort({ image1, image2 in image1.fileID > image2.fileID })
images = images.sort({ $0.fileID > $1.fileID })

বাছাইয়ের কার্যকারী নীতি সম্পর্কে বিস্তৃত ব্যাখ্যার জন্য, সাজানো কার্যকারিতা দেখুন


আমি কি এটি তুলনা অনুসারে বাছাই করতে ব্যবহার করতে পারি, উদাহরণস্বরূপ সপ্তাহের দিনগুলিতে অ্যারে বাছাই করা? যদি তাই হয়, কিভাবে?
ক্রিস্টোফার

একটি উত্তর পোস্ট করার জন্য আপনাকে ধন্যবাদ যা দেখায় যে পাঠকরা "সরলীকৃত" বন্ধের ক্রিপ্টিক সিনট্যাক্সকে বোঝার পরিবর্তে কীভাবে একটি ক্লোজার কাজ করে!
ব্যবহারকারী 1118321

50

সুইফট 3

people = people.sorted(by: { $0.email > $1.email })

আমি তারিখের তুলনা করে এটি চেষ্টা করেছি, এটি কাজ করতে পারিনি। কোন ধারণা?
এবরু গঙ্গার

এনএসডিট বা স্ট্রিং নয়, বর্তমান সুইফট 3 তারিখের অবজেক্ট।
এবরু গঙ্গার

আপনি তারিখের কোন সম্পত্তিটির সাথে তুলনা করছেন? সম্পত্তিটি অবশ্যই ব্যবহৃত ফাংশনের সাথে তুলনা করতে সক্ষম হতে হবে (আমার উদাহরণের চেয়ে বেশি)
ক্রেমফুল

9
এটি 2017 এর পরে একমাত্র দরকারী উত্তর।
ফ্যাটি

@ ফ্যাটি আপনার অর্থ কী? সঠিক বাক্য people.sort { $0.email > $1.email }
গঠনটি

43

সুইফট 5 এর সাথে Arrayদুটি পদ্ধতি বলা হয় sorted()এবং sorted(by:)। প্রথম পদ্ধতিটি, sorted()এর নিম্নলিখিত ঘোষণা রয়েছে:

সাজানো সংগ্রহের উপাদানগুলি ফেরত দেয়।

func sorted() -> [Element]

দ্বিতীয় পদ্ধতিটি, sorted(by:)এর নিম্নলিখিত ঘোষণা রয়েছে:

উপাদানগুলির মধ্যে তুলনা হিসাবে প্রদত্ত প্রাকটিকেট ব্যবহার করে সাজানো সংগ্রহের উপাদানগুলি ফেরত দেয়।

func sorted(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> [Element]

# 1। তুলনীয় অবজেক্টের জন্য আরোহী ক্রম দিয়ে বাছাই করুন

যদি আপনার সংগ্রহের অভ্যন্তরের উপাদান টাইপ Comparableপ্রোটোকলের সাথে সামঞ্জস্য করে তবে আপনি sorted()আপনার উপাদানগুলিকে আরোহণের ক্রম অনুসারে বাছাই করতে ব্যবহার করতে সক্ষম হবেন । নিম্নলিখিত খেলার মাঠের কোডটি কীভাবে ব্যবহার করতে হবে তা দেখায় sorted():

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted()
print(sortedImages)

/*
 prints: [ImageFile with ID: 100, ImageFile with ID: 200, ImageFile with ID: 300]
 */

# 2। তুলনীয় অবজেক্টের জন্য অবতরণ ক্রম অনুসারে বাছাই করুন

যদি আপনার সংগ্রহের অভ্যন্তরের উপাদান ধরণটি Comparableপ্রোটোকলের সাথে সামঞ্জস্য করে তবে sorted(by:)আপনার উপাদানগুলিকে একটি উতরিত ক্রমের সাথে বাছাই করতে আপনাকে ব্যবহার করতে হবে ।

class ImageFile: CustomStringConvertible, Comparable {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

    static func ==(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID == rhs.fileID
    }

    static func <(lhs: ImageFile, rhs: ImageFile) -> Bool {
        return lhs.fileID < rhs.fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0 > img1
})
//let sortedImages = images.sorted(by: >) // also works
//let sortedImages = images.sorted { $0 > $1 } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

# 3। তুলনীয়হীন অবজেক্টের জন্য আরোহী বা অবতরণ ক্রম অনুসারে বাছাই করুন

যদি আপনার সংগ্রহে থাকা উপাদানগুলির ধরণটি Comparableপ্রোটোকলের সাথে সামঞ্জস্য না করে তবে sorted(by:)আপনার উপাদানগুলিকে আরোহী বা অবতরণ ক্রম অনুসারে বাছাই করতে আপনাকে ব্যবহার করতে হবে ।

class ImageFile: CustomStringConvertible {

    let fileName: String
    let fileID: Int
    var description: String { return "ImageFile with ID: \(fileID)" }

    init(fileName: String, fileID: Int) {
        self.fileName = fileName
        self.fileID = fileID
    }

}

let images = [
    ImageFile(fileName: "Car", fileID: 300),
    ImageFile(fileName: "Boat", fileID: 100),
    ImageFile(fileName: "Plane", fileID: 200)
]

let sortedImages = images.sorted(by: { (img0: ImageFile, img1: ImageFile) -> Bool in
    return img0.fileID < img1.fileID
})
//let sortedImages = images.sorted { $0.fileID < $1.fileID } // also works
print(sortedImages)

/*
 prints: [ImageFile with ID: 300, ImageFile with ID: 200, ImageFile with ID: 100]
 */

নোট করুন যে সুইফট দুটি কল হিসাবে ডাকা হয় sort()এবং এর sort(by:)সমকক্ষ হিসাবে sorted()এবং sorted(by:)যদি আপনার সংগ্রহ জায়গায় জায়গায় সাজানোর প্রয়োজন হয়।



20

আপনি যেমন কিছু করতে পারেন

images = sorted(images) {$0.fileID > $1.fileID}

সুতরাং আপনার চিত্র অ্যারে বাছাই হিসাবে সংরক্ষণ করা হবে


19

সুইফট 2 থেকে 4

মূল উত্তরটি কিছু সম্পত্তি ব্যবহার করে কাস্টম অবজেক্টগুলির একটি অ্যারে বাছাই করার চেষ্টা করেছিল। নীচে আমি আপনাকে একই আচরণ ডাব্লু / সুইফ্ট ডেটা স্ট্রাকচার করার কয়েকটি সহজ উপায় দেখাব!

ছোট জিনিসগুলি এর বাইরে, আমি এতটা সামান্য ইমেজফাইলে পরিবর্তন করেছি। এটি মনে রেখে, আমি তিনটি চিত্র ফাইল সহ একটি অ্যারে তৈরি করি । লক্ষ্য করুন যে মেটাডেটা হ'ল একটি valueচ্ছিক মান, প্যারামিটার হিসাবে শূন্যের মধ্য দিয়ে যাওয়া আশা করা যায়।

 struct ImageFile {
      var name: String
      var metadata: String?
      var size: Int
    }

    var images: [ImageFile] = [ImageFile(name: "HelloWorld", metadata: nil, size: 256), ImageFile(name: "Traveling Salesmen", metadata: "uh this is huge", size: 1024), ImageFile(name: "Slack", metadata: "what's in this stuff?", size: 2048) ]

ইমেজফাইলে আকারের একটি সম্পত্তি রয়েছে। নীচের উদাহরণগুলির জন্য আমি আপনাকে দেখাবো কীভাবে আকারের মতো অপারেশন ডাব্লু / বৈশিষ্ট্যগুলি ব্যবহার করতে হয় use

বৃহত্তম থেকে বড় আকারের (<)

    let sizeSmallestSorted = images.sorted { (initial, next) -> Bool in
      return initial.size < next.size
    }

বৃহত্তম থেকে ছোট (>)

    let sizeBiggestSorted = images.sorted { (initial, next) -> Bool in
      return initial.size > next.size
    }

পরবর্তী আমরা স্ট্রিং সম্পত্তি নাম ব্যবহার করে বাছাই করব। একই পদ্ধতিতে, স্ট্রিংগুলির সাথে তুলনা করতে বাছাই করুন। তবে লক্ষ্য করুন যে অভ্যন্তরীণ ব্লক একটি তুলনা ফলাফল দেয়। এই ফলাফলটি সাজানোর সংজ্ঞা দেবে।

এজেড (.অর্ডারডঅ্যাসেন্ডিং)

    let nameAscendingSorted = images.sorted { (initial, next) -> Bool in
      return initial.name.compare(next.name) == .orderedAscending
    }

জেডএ (.অর্ডারডডেন্ডেন্ডিং)

    let nameDescendingSorted = images.sorted { (initial, next) -> Bool in
      return initial.name.compare(next.name) == .orderedDescending
    }

এর পরে বাছাই করার আমার প্রিয় উপায়, অনেক ক্ষেত্রে একের মধ্যে optionচ্ছিক বৈশিষ্ট্য থাকবে। এখন চিন্তা করবেন না, আমরা উপরের মত একই পদ্ধতিতে বাছাই করতে যাচ্ছি যদি আমাদের শূন্য করতে না হয়! উৎপাদন;

আমি এই কোডটি ব্যবহার করে শুল্ক সম্পত্তি মান সহ আমার অ্যারে সমস্ত দাবী সর্বশেষ হতে বাধ্য। তারপরে ধরে নেওয়া মোড়কযুক্ত মানগুলি ব্যবহার করে মেটাডেটা অর্ডার করুন।

    let metadataFirst = images.sorted { (initial, next) -> Bool in
      guard initial.metadata != nil else { return true }
      guard next.metadata != nil else { return true }
      return initial.metadata!.compare(next.metadata!) == .orderedAscending
    }

বিকল্পগুলির জন্য একটি সেকেন্ডারি বাছাই করা সম্ভব। উদাহরণ স্বরূপ; একটি মেটাডেটা দিয়ে আকার দেখাতে এবং আকার অনুসারে অর্ডার করতে পারে।


1
সাধারণত, উত্তরগুলি আরও কার্যকর হয় যদি সেগুলিতে কোডটি কী করা উচিত এবং কেন এটি অন্যকে পরিচয় করিয়ে না দিয়ে সমস্যার সমাধান করে তার ব্যাখ্যা অন্তর্ভুক্ত করে।
টম

আরও অনেক ভাল।
টম আরান্ডা

18

দুটি বিকল্প

1) সাজানোইনপ্লেস দিয়ে মূল অ্যারে অর্ডার করা

self.assignments.sortInPlace({ $0.order < $1.order })
self.printAssignments(assignments)

2) আদেশযুক্ত অ্যারে সঞ্চয় করতে বিকল্প অ্যারে ব্যবহার করে

var assignmentsO = [Assignment] ()
assignmentsO = self.assignments.sort({ $0.order < $1.order })
self.printAssignments(assignmentsO)

3
পুনরায় ২) খালি অ্যারে তৈরি করে একে একে একে একে পরের লাইনে ফেলে দেওয়ার কোন মানে? আমি ব্যবহার করে সাজেস্ট করব var assignmentsO : [Assignment]বা এটি ব্যবহার করে এক লাইনে একত্রিত করবlet assignmentsO = self.assignments.sort({ $0.order < $1.order })
হারমান ক্লেকার

2
হাই হারম্যান! পাঠযোগ্য ও দক্ষ কোড রচনার মধ্যে খুব পাতলা রেখা রয়েছে। এই ক্ষেত্রে, একমাত্র পয়েন্টটি এটিকে সম্প্রদায়ের কাছে আরও পাঠযোগ্য করে তুলছে;) উপভোগ করুন!
বার্নাউয়ার

18

সুইফট ৪.০, ৪.১ এবং ৪.২ প্রথমত, আমি নীচের চিত্র অনুসারে ইমেজফিল () এর টাইপের মিউটেটেবল অ্যারে তৈরি করেছি

var arr = [imageFile]()

টাইপ ইমেজফাইলে () এর মিউটেটেবল অবজেক্ট ইমেজ তৈরি করুন এবং নীচে প্রদর্শিত হিসাবে বৈশিষ্ট্যগুলিকে মান নির্ধারণ করুন

   var image = imageFile()
   image.fileId = 14
   image.fileName = "A"

এখন, এই বস্তুটি অ্যারে অ্যারে যুক্ত করুন

    arr.append(image)

এখন একই বৈশিষ্ট্যযুক্ত ইমেজকে বিভিন্ন বৈশিষ্ট্য বরাদ্দ করুন

   image = imageFile()
   image.fileId = 13
   image.fileName = "B"

এখন, আবার অ্যারের সাথে চিত্র অবজেক্ট যুক্ত করুন

    arr.append(image)

এখন আমরা প্রয়োগ করা হবে ঊর্ধ্বক্রম উপর fileId অ্যারে-Arr বস্তু সম্পত্তি। আরোহী ক্রমের জন্য <প্রতীক ব্যবহার করুন

 arr = arr.sorted(by: {$0.fileId < $1.fileId}) // arr has all objects in Ascending order
 print("sorted array is",arr[0].fileId)// sorted array is 13
 print("sorted array is",arr[1].fileId)//sorted array is 14

এখন আমরা প্রয়োগ করা হবে অধ: ক্রম উপর fileId অ্যারে-Arr বস্তু সম্পত্তি। অবতরণ ক্রমের জন্য > প্রতীক ব্যবহার করুন

 arr = arr.sorted(by: {$0.fileId > $1.fileId}) // arr has all objects in Descending order
 print("Unsorted array is",arr[0].fileId)// Unsorted array is 14
 print("Unsorted array is",arr[1].fileId)// Unsorted array is 13

সুইফটে 4.1। & 4.2 বাছাই করা অর্ডার ব্যবহারের জন্য

let sortedArr = arr.sorted { (id1, id2) -> Bool in
  return id1.fileId < id2.fileId // Use > for Descending order
}

8

আপনি যদি এই অ্যারেটিকে একাধিক জায়গায় বাছাই করতে যাচ্ছেন তবে আপনার অ্যারে টাইপটিকে তুলনীয় করে তোলা বুদ্ধিমান হতে পারে।

class MyImageType: Comparable, Printable {
    var fileID: Int

    // For Printable
    var description: String {
        get {
            return "ID: \(fileID)"
        }
    }

    init(fileID: Int) {
        self.fileID = fileID
    }
}

// For Comparable
func <(left: MyImageType, right: MyImageType) -> Bool {
    return left.fileID < right.fileID
}

// For Comparable
func ==(left: MyImageType, right: MyImageType) -> Bool {
    return left.fileID == right.fileID
}

let one = MyImageType(fileID: 1)
let two = MyImageType(fileID: 2)
let twoA = MyImageType(fileID: 2)
let three = MyImageType(fileID: 3)

let a1 = [one, three, two]

// return a sorted array
println(sorted(a1)) // "[ID: 1, ID: 2, ID: 3]"

var a2 = [two, one, twoA, three]

// sort the array 'in place'
sort(&a2)
println(a2) // "[ID: 1, ID: 2, ID: 2, ID: 3]"

6

আপনি যদি কাস্টম অবজেক্ট ব্যবহার না করে থাকেন তবে এর পরিবর্তে মানের ধরণগুলি তুলনামূলক প্রোটোকল (ইনট, স্ট্রিং ইত্যাদি ..) প্রয়োগ করে আপনি কেবল এটি করতে পারেন:

myArray.sort(>) //sort descending order

একটি উদাহরণ:

struct MyStruct: Comparable {
    var name = "Untitled"
}

func <(lhs: MyStruct, rhs: MyStruct) -> Bool {
    return lhs.name < rhs.name
}
// Implementation of == required by Equatable
func ==(lhs: MyStruct, rhs: MyStruct) -> Bool {
    return lhs.name == rhs.name
}

let value1 = MyStruct()
var value2 = MyStruct()

value2.name = "A New Name"

var anArray:[MyStruct] = []
anArray.append(value1)
anArray.append(value2)

anArray.sort(>) // This will sort the array in descending order

সুইফ্ট 3 এ এটিmyArray.sorted(by: >)
বেরিলিয়াম

6

আপনি নিম্নলিখিত উপায়ে ফাইলআইডি সম্পত্তি থেকে একটি সাজানো অ্যারে ফিরিয়ে দিন:

সুইফট 2

let sortedArray = images.sorted({ $0.fileID > $1.fileID })

সুইফট 3 বা 4

let sortedArray = images.sorted(by: { $0.fileID > $1.fileID })

সুইফ্ট 5.0

let sortedArray = images.sorted {
    $0.fileID < $1.fileID
}

মোহন মত কাজ করে .. upvated! (প্রতীক প্রজাপতি, আহমেদাবাদ)
এনএসপ্র্যাটিক

4

আমি এটি এর মতো করি এবং এটি কার্যকর হয়:

var images = [imageFile]() images.sorted(by: {$0.fileID.compare($1.fileID) == .orderedAscending })


2

আপনি যদি কাস্টম অবজেক্টের মূল অ্যারে বাছাই করতে চান। সুইফট ২.১-এ এটি করার আরেকটি উপায়

var myCustomerArray = [Customer]()
myCustomerArray.sortInPlace {(customer1:Customer, customer2:Customer) -> Bool in
    customer1.id < customer2.id
}

idএকটি পূর্ণসংখ্যা যেখানে । আপনি একই বৈশিষ্ট্য হিসাবে একই <অপারেটর ব্যবহার করতে পারেন String

আপনি এখানে এর উদাহরণটি দেখে এর ব্যবহার সম্পর্কে আরও শিখতে পারেন: সুইফট ২: নিকটবর্তী গ্রাহকরা



1

সুইফট 3 এবং 4 এবং 5

লোয়ারকেস এবং ক্যাপিটাল কেস সম্পর্কিত আমার কিছু সমস্যা ছিল

সুতরাং আমি এই কোড করেছি

let sortedImages = images.sorted(by: { $0.fileID.lowercased() < $1.fileID.lowercased() })

এবং তারপরে সাজানো চিত্রগুলি ব্যবহার করুন


0

কীপথ ব্যবহার করে বাছাই করুন

আপনি এটির KeyPathমতো বাছাই করতে পারেন :

myArray.sorted(by: \.fileName, <) /* using `<` for ascending sorting */

এই সামান্য সহায়ক এক্সটেনশন প্রয়োগ করে।

extension Collection{
    func sorted<Value: Comparable>(
        by keyPath: KeyPath<Element, Value>,
        _ comparator: (_ lhs: Value, _ rhs: Value) -> Bool) -> [Element] {
        sorted { comparator($0[keyPath: keyPath], $1[keyPath: keyPath]) }
    }
}

আশা করি সুইফট অদূর ভবিষ্যতে ভাষার মূল অংশে এটি যুক্ত করবে।


এটি ইতিমধ্যে পরিবর্তিত পদ্ধতির পাশাপাশি এখানে stackoverflow.com/a/46601105/2303865 জবাব দেওয়া হয়েছে ।
লিও ডাবাস

পরিবর্তিত সংস্করণpublic extension MutableCollection where Self: RandomAccessCollection { mutating func sort<T>(_ keyPath: KeyPath<Element, T>, by areInIncreasingOrder: (T, T) throws -> Bool) rethrows where T: Comparable { try sort { try areInIncreasingOrder($0[keyPath: keyPath], $1[keyPath: keyPath]) } }}
লিও ডাবাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.