উত্তর:
যেহেতু সুইফট কিছুটা অবজেক্ট-ওরিয়েন্টেডের চেয়ে বেশি কার্যকরী হয় (এবং অ্যারেগুলি স্ট্রাক্ট হয়, অবজেক্ট নয়), অ্যারেতে কাজ করতে "সন্ধান করুন" ফাংশনটি ব্যবহার করে, যা একটি alচ্ছিক মান দেয়, তাই শূন্য মানটি হ্যান্ডেল করার জন্য প্রস্তুত থাকুন:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
সুইফট ২.০ এর জন্য আপডেট:
পুরানো find
ফাংশনটি আর সুইফট ২.০ সহ সমর্থিত নয়!
সুইফট ২.০ সহ, (যা প্রয়োগ করে) এর Array
একটি এক্সটেনশনে সংজ্ঞায়িত একটি ফাংশন ব্যবহার করে কোনও উপাদানটির সূচক সন্ধান করার ক্ষমতা অর্জন করে :CollectionType
Array
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
অতিরিক্তভাবে, একটি প্রাকটিকাকে পূরণকারী অ্যারেতে প্রথম উপাদান সন্ধান করা এর অন্য এক্সটেনশন দ্বারা সমর্থিত CollectionType
:
let arr2 = [1,2,3,4,5,6,7,8,9,10]
let indexOfFirstGreaterThanFive = arr2.indexOf({$0 > 5}) // 5
let indexOfFirstGreaterThanOneHundred = arr2.indexOf({$0 > 100}) // nil
নোট করুন যে এই দুটি ফাংশন পূর্বের মতো optionচ্ছিক মানগুলি ফেরত দেয় find
।
সুইফট 3.0 এর জন্য আপডেট:
নোট করুন সূচিপত্রের সিনট্যাক্সটি পরিবর্তিত হয়েছে। Equatable
আপনার অনুসারে আইটেমগুলি ব্যবহার করতে পারেন:
let indexOfA = arr.index(of: "a")
পদ্ধতির বিস্তারিত ডকুমেন্টেশন https://developer.apple.com/references/swift/array/1689674-index এ পাওয়া যাবে
অ্যারে আইটেমগুলির সাথে খাপ খায় না এমনগুলির জন্য Equatable
আপনাকে ব্যবহার করতে হবে index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
সুইফট 4.2 এর জন্য আপডেট:
সুইফট 4.2 দিয়ে, index
আর ব্যবহৃত হয় কিন্তু বিভক্ত করা হয় firstIndex
এবং lastIndex
ভাল শোধন জন্য। সুতরাং আপনি আইটেমের প্রথম বা শেষ সূচকের সন্ধান করছেন কিনা তার উপর নির্ভর করে:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
নিজেকে সংজ্ঞায়িত করে থাকেন তবে আপনার স্ট্রাক্ট Equatable
প্রোটোকলটি মেনে চলতে হবে ।
TL; ড:
ক্লাসগুলির জন্য, আপনি খুঁজছেন হতে পারে:
let index = someArray.firstIndex{$0 === someObject}
পুরো উত্তর:
আমি মনে করি এটি উল্লেখযোগ্য যে রেফারেন্স প্রকারের সাথে ( class
) আপনি একটি পরিচয় তুলনা করতে চাইতে পারেন , সেক্ষেত্রে আপনাকে কেবল ===
পরিচয় অপারেটরটি ভবিষ্যদ্বাণীীয় বন্ধে ব্যবহার করতে হবে :
সুইফট 5, সুইফট 4.2:
let person1 = Person(name: "John")
let person2 = Person(name: "Sue")
let person3 = Person(name: "Maria")
let person4 = Person(name: "Loner")
let people = [person1, person2, person3]
let indexOfPerson1 = people.firstIndex{$0 === person1} // 0
let indexOfPerson2 = people.firstIndex{$0 === person2} // 1
let indexOfPerson3 = people.firstIndex{$0 === person3} // 2
let indexOfPerson4 = people.firstIndex{$0 === person4} // nil
নোট করুন যে উপরের সিনট্যাক্সটি ট্রেলিং ক্লোজার্স সিনট্যাক্স ব্যবহার করে এবং এর সমতুল্য:
let indexOfPerson1 = people.firstIndex(where: {$0 === person1})
সুইফট 4 / সুইফট 3 - ফাংশনটি বলা হত index
সুইফট 2 - ফাংশনটি বলা হত indexOf
* প্রাসঙ্গিক ও দ্রষ্টব্য মন্তব্য দ্বারা paulbailey সম্পর্কে class
যে বাস্তবায়ন ধরনের Equatable
, যেখানে আপনি কিনা আপনি ব্যবহার তুলনা করা উচিত বিবেচনা করতে হবে ===
( পরিচয় অপারেটর) অথবা ==
( সমতা অপারেটর)। যদি আপনি ব্যবহার করে মিলে যাওয়ার সিদ্ধান্ত নেন ==
, তবে আপনি কেবল অন্যদের পরামর্শ দেওয়া পদ্ধতিটি ব্যবহার করতে পারেন ( people.firstIndex(of: person1)
)।
Person
বাস্তবায়িত Equatable
প্রোটোকল, এই প্রয়োজন না করা হবে।
Binary operator '===' cannot be applied to operands of type '_' and 'Post'
, Post
আমার struct হয় হচ্ছে ... তোর কোন সমস্যা?
structs
(এবং enums
) মান ধরণের, রেফারেন্স প্রকার নয়। শুধুমাত্র রেফারেন্সের ধরণের (যেমন class
) পরিচয়ের তুলনা যুক্তি ( ===
) রয়েছে। কী করতে হবে তার জন্য অন্যান্য উত্তরগুলি পরীক্ষা করে দেখুন structs
(মূলত আপনি কেবল এটি ব্যবহার করেন array.index(of: myStruct)
, নিশ্চিত ধরণের myStruct
কনফার্মগুলি তৈরি করে Equatable
( ==
))।
আপনি filter
ক্লোজার সহ একটি অ্যারে করতে পারেন :
var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 } // <= returns [3]
এবং আপনি একটি অ্যারে গণনা করতে পারেন:
filtered.count // <= returns 1
সুতরাং আপনি নির্ধারণ করতে পারেন যদি একটি অ্যারের এই মিশ্রন দ্বারা আপনার উপাদান রয়েছে:
myList.filter { $0 == 3 }.count > 0 // <= returns true if the array includes 3
আপনি যদি অবস্থানটি সন্ধান করতে চান তবে আমি অভিনব উপায় দেখতে পাচ্ছি না তবে আপনি অবশ্যই এটি এটি করতে পারেন:
var found: Int? // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
if x[i] == 3 {
found = i
}
}
সম্পাদনা
আমরা এটির সময়ে, একটি মজাদার অনুশীলনের জন্য আসুন Array
একটি find
পদ্ধতি রাখি :
extension Array {
func find(includedElement: T -> Bool) -> Int? {
for (idx, element) in enumerate(self) {
if includedElement(element) {
return idx
}
}
return nil
}
}
এখন আমরা এটি করতে পারি:
myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found
Array
এমন একটি find
পদ্ধতিতে প্রসারিত করেছি যা আপনি যা চান তা করে। আমি জানি না এটি একটি ভাল অনুশীলন কিনা, তবে এটি একটি ঝরঝরে পরীক্ষা।
enumerate
যাতে এটি আর প্রযোজ্য না, তবে আপনি একেবারেই ঠিক।
func firstIndex(of element: Element) -> Int?
var alphabets = ["A", "B", "E", "D"]
Example1
let index = alphabets.firstIndex(where: {$0 == "A"})
Example2
if let i = alphabets.firstIndex(of: "E") {
alphabets[i] = "C" // i is the index
}
print(alphabets)
// Prints "["A", "B", "C", "D"]"
indexOf()
পুরোপুরি কাজ করার সময় , এটি কেবল একটি সূচক দেয় returns
আমি উপাদানগুলির জন্য সূচকগুলির একটি অ্যারে পেতে একটি মার্জিত উপায় খুঁজছিলাম যা কিছু শর্ত পূরণ করে।
এটি কীভাবে করা যায় তা এখানে:
সুইফট 3:
let array = ["apple", "dog", "log"]
let indexes = array.enumerated().filter {
$0.element.contains("og")
}.map{$0.offset}
print(indexes)
সুইফট 2:
let array = ["apple", "dog", "log"]
let indexes = array.enumerate().filter {
$0.element.containsString("og")
}.map{$0.index}
print(indexes)
কাস্টম শ্রেণীর জন্য আপনার সমতুল্য প্রোটোকলটি প্রয়োগ করতে হবে।
import Foundation
func ==(l: MyClass, r: MyClass) -> Bool {
return l.id == r.id
}
class MyClass: Equtable {
init(id: String) {
self.msgID = id
}
let msgID: String
}
let item = MyClass(3)
let itemList = [MyClass(1), MyClass(2), item]
let idx = itemList.indexOf(item)
printl(idx)
সুইফট 2 এর জন্য আপডেট:
সিকোয়েন্স। কনটেনস (উপাদান) : প্রদত্ত অনুক্রম (যেমন একটি অ্যারে) নির্দিষ্ট উপাদান অন্তর্ভুক্ত করা হলে সত্যটি প্রত্যাবর্তন করে।
সুইফট 1:
যদি আপনি কেবল অ্যারের ভিতরে কোনও উপাদান রয়েছে কিনা তা খতিয়ে দেখতে খুঁজছেন, এটি হ'ল একটি বুলিয়ান সূচক পান, এর contains(sequence, element)
পরিবর্তে ব্যবহার করুন find(array, element)
:
রয়েছে (ক্রম, উপাদান) : যদি প্রদত্ত অনুক্রম (যেমন একটি অ্যারে) নির্দিষ্ট উপাদান থাকে তবে সত্যটি প্রত্যাবর্তন করে।
নীচে উদাহরণ দেখুন:
var languages = ["Swift", "Objective-C"]
contains(languages, "Swift") == true
contains(languages, "Java") == false
contains([29, 85, 42, 96, 75], 42) == true
if (contains(languages, "Swift")) {
// Use contains in these cases, instead of find.
}
মধ্যে সুইফট 4.2
.index (যেখানে :) এ পরিবর্তিত হয়েছে .firstIndex (যেখানে :)
array.firstIndex(where: {$0 == "person1"})
সুইফট ৪. যদি আপনার অ্যারেতে [স্ট্রিং: যেকোনওজেক্ট] টাইপের উপাদান থাকে। সুতরাং উপাদান সূচী খুঁজে পেতে নীচের কোড ব্যবহার করুন
var array = [[String: AnyObject]]()// Save your data in array
let objectAtZero = array[0] // get first object
let index = (self.array as NSArray).index(of: objectAtZero)
অথবা আপনি যদি অভিধান থেকে কী এর ভিত্তিতে সূচকটি পেতে চান। এখানে অ্যারেতে মডেল ক্লাসের অবজেক্টস রয়েছে এবং আমি আইডি সংস্থার সাথে মিল করছি।
let userId = 20
if let index = array.index(where: { (dict) -> Bool in
return dict.id == userId // Will found index of matched id
}) {
print("Index found")
}
OR
let storeId = Int(surveyCurrent.store_id) // Accessing model key value
indexArrUpTo = self.arrEarnUpTo.index { Int($0.store_id) == storeId }! // Array contains models and finding specific one
সুইফট 2.1
var array = ["0","1","2","3"]
if let index = array.indexOf("1") {
array.removeAtIndex(index)
}
print(array) // ["0","2","3"]
সুইফট 3
var array = ["0","1","2","3"]
if let index = array.index(of: "1") {
array.remove(at: index)
}
array.remove(at: 1)
let array
? এর ব্যবহারself
প্রশ্নবিদ্ধ।
ইন সুইফট 4 , যদি আপনি আপনার DataModel অ্যারে মাধ্যমে ঢোঁড়ন হয়, Equatable প্রোটোকল নিশ্চিত আপনার ডেটা মডেল কে কনর্ফাম করে, LHS বাস্তবায়ন পদ্ধতি RHS করা =, এবং শুধুমাত্র তারপর আপনি ".index (এর" ব্যবহার করতে পারেন। উদাহরণস্বরূপ
class Photo : Equatable{
var imageURL: URL?
init(imageURL: URL){
self.imageURL = imageURL
}
static func == (lhs: Photo, rhs: Photo) -> Bool{
return lhs.imageURL == rhs.imageURL
}
}
এবং তারপর,
let index = self.photos.index(of: aPhoto)
সুইফট 2 এ (এক্সকোড 7 Array
সহ ), প্রোটোকল indexOf
দ্বারা সরবরাহিত একটি পদ্ধতি অন্তর্ভুক্ত CollectionType
করে। (প্রকৃতপক্ষে, দুটি indexOf
পদ্ধতি — একটি যা যুক্তির সাথে মেলে সাম্য ব্যবহার করে এবং অন্যটি একটি ক্লোজার ব্যবহার করে))
সুইফট 2 এর আগে সংগ্রহের মতো জেনেরিক ধরণের জন্য তাদের থেকে প্রাপ্ত কংক্রিটের ধরণের জন্য পদ্ধতি সরবরাহ করার উপায় ছিল না (অ্যারেগুলির মতো)। সুতরাং, সুইফট 1.x এ, "সূচক" হ'ল একটি গ্লোবাল ফাংশন ... এবং এটির নতুন নামকরণও হয়েছিল, তাই সুইফট 1.x এ, যেটিকে বিশ্বব্যাপী ফাংশন বলা হয় find
।
ফাউন্ডেশন indexOfObject
থেকে NSArray
... বা অন্য যে কোনও একটি থেকে এই পদ্ধতিটি ব্যবহার করা সম্ভব (তবে প্রয়োজনীয় নয়) যা সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরিতে সমতুল্য নয়। কেবল import Foundation
(বা অন্য কোনও মডিউল যা অস্থায়ীভাবে ফাউন্ডেশন আমদানি করে), এতে আপনার কাস্ট Array
করে NSArray
, এবং আপনি প্রচুর অনুসন্ধান পদ্ধতি ব্যবহার করতে পারেন NSArray
।
এই সমাধানের যে কোনওটি আমার পক্ষে কাজ করে
এই সমাধানটি আমার কাছে সুইফট 4 এর জন্য রয়েছে:
let monday = Day(name: "M")
let tuesday = Day(name: "T")
let friday = Day(name: "F")
let days = [monday, tuesday, friday]
let index = days.index(where: {
//important to test with === to be sure it's the same object reference
$0 === tuesday
})
আপনি যেমন অ্যারেতে সূচিপত্র করতে একটি ফাংশনাল লাইব্রেরি ডলারও ব্যবহার করতে পারেন যেমন http://www.dolilerswift.org/#indexof-indexof
$.indexOf([1, 2, 3, 1, 2, 3], value: 2)
=> 1
আপনি যদি এখনও সুইফট 1.x এ কাজ করছেন
তারপরে চেষ্টা করুন,
let testArray = ["A","B","C"]
let indexOfA = find(testArray, "A")
let indexOfB = find(testArray, "B")
let indexOfC = find(testArray, "C")
SWIFT 3 এর জন্য আপনি একটি সাধারণ ফাংশন ব্যবহার করতে পারেন
func find(objecToFind: String?) -> Int? {
for i in 0...arrayName.count {
if arrayName[i] == objectToFind {
return i
}
}
return nil
}
এটি নম্বর পজিশন দেবে, যাতে আপনি পছন্দ মতো ব্যবহার করতে পারেন
arrayName.remove(at: (find(objecToFind))!)
আশা করি কাজে লাগবে
সুইফট 4
ধরা যাক যে আপনি অ্যারে থেকে কার্ডবটটন নামক কার্ডটি নাম্বারে একটি নম্বর সঞ্চয় করতে চান, আপনি এটি এইভাবে করতে পারেন:
let cardNumber = cardButtons.index(of: sender)
প্রেরক আপনার বোতামের নাম
সুইফ্ট 4/5-তে, সূচক সন্ধানের জন্য "ফার্স্ট ইন্ডেক্স" ব্যবহার করুন।
let index = array.firstIndex{$0 == value}
যদি কারও এই সমস্যা হয়
Cannot invoke initializer for type 'Int' with an argument list of type '(Array<Element>.Index?)'
এই কাজ
extension Int {
var toInt: Int {
return self
}
}
তারপর
guard let finalIndex = index?.toInt else {
return false
}
জন্য (>= swift 4.0)
এটা বরং খুব সহজ। নিম্নলিখিত Array
বিষয় বিবেচনা করুন ।
var names: [String] = ["jack", "rose", "jill"]
উপাদানটির সূচক পেতে rose
, আপনাকে যা করতে হবে তা হ'ল:
names.index(of: "rose") // returns 1
বিঃদ্রঃ:
Array.index(of:)
একটি ফেরৎ Optional<Int>
।
nil
বোঝায় যে উপাদান অ্যারে উপস্থিত নেই।
আপনি ফিরে আসা মানটি জোর-আন-মোড়ক করতে চাইতে পারেন বা if-let
aroundচ্ছিকটি পেতে একটি ব্যবহার করতে পারেন।