واردن کردن مجموعه از داده ها به یک متغیر در یک حلقه for
درود خدمت شما . به یک مشکلی برخورد کردم که حل نتونستم بکنمش
فکر بکنید یک متغییر در بالای کلاس تعریف کردم به به صورت زیر
internal var iDcheack:Int!
حالا یک حلقه دارم به صورت زیر
for tus in tuss {
var test = nameData
print(test)
}
این حلقه یک داده ای که از یک جایی می گیره رو داره چاپ می کنه پشت هم
حالا چیجوری می تونم تمام داده هایی که این حلقه هست بدم به یک آرایه ( متغییر ) و از اون در جای دیگه استفاده کنم. اگر بیام داخل خود for این مورد رو انجام بدم متاسفانه فقط آخرین داده در متغییر ذخیره می شه مثلا به صورت زیر
for tus in tuss {
var test = nameData
print(test)
iDcheack = test
}
اصل کار برای این هست که من یک پروژه ای رو برای تمرین استارت زدم . که این پروژه وقتی به بالا می کشی صفحه رفرش می شه خوب من در دستور رفرش tableview خودم رو ریلود دیتا کردم جواب نداد ولی اومدم حلقه رو قرار دادم توش بعد از رفرش دوباره می یاد تمام داده هارو می یاره که تکراری می شه در اینجا من می خوام چک کنم اگر آیدی من با id مواردی که الان هستن یکی هست چاپ نشه متسفانه فقط می تونه جلوی یک id بگیره چون تو متغییرم فقط یک شماره ذخیره می شه
نکته من در بالا خود متغییر iDcheack رو از نوع آرایه اینا هم قرار دادم موفق نشدم.
بعد از کشیدن اپ از بالا و رفرش شدن حتی تو مین ترد هم قرار دادم نشد به همین منظور می خوام با این مورد حلش کنم و آیدی رو بگیرم . یعنی آیدی رو توی یک فانکشن جدا و دست ساز استفاده کنم
dispatch_async(dispatch_get_main_queue()) {
self.tableviews.reloadData()
self.refreshControl.endRefreshing()
}
تشکر
سلام ،
اگر قصد دارید که داده ای رو در آرایه اضافه کنید ، بخش آموزش کار با آرایه ها را مطالعه کنید توضیحات لازم در رابطه با افزودن مقدار به آرایه توضیح داده شده، اما به طور کل از دستور زیر برای افزودن به آرایه میتونید استفاده کنید :
anArray.append("This String")
حالا اگر موفق شدید که داده ها را به آرایه اضافه کنید بعد میتونید برید سراغ مرحله بعدی که مربوط به ریفرش شدن اطلاعات لیست هست .
سوال بعدی که در بخش نظرات مطرح کردید که چرا Swift به مقایسه Int با [Int] مشکل میگیره ، به خاطر این هست که شما متغیری از جنس Int را با آرایه ای از این نوع نمیتوانید مقایسه کنید ، باید ابتدا با استفاده از حلقه for داده های داخل آرایه را تک تک بیرون بکشید و در همان حلقه مقایسه را انجام دهید .
نحوه تعریف کردن آرایه هم به این شکل هست
var number: [Int] = []
ابتدا کلمه کلیدی var که نشان دهنده تعریف یک متغیر است ، سپس نام آرایه و بعد از آن نوع آرایه را مشخص میکنیم مثلا در دستور بالا من آرایه ای از نوع Int ایجاد کردم که میتونه اعداد رو داخل خودش نگه داره .
واقعا آقای کاشی زاده کل این پروژه رو شما درست کردی و من واقعا شرمندم . درست فرمودید بلخره تونستم یک داده ای رو در هرجا نیاز دارم استفاده کنم یعنی واقعا نیاز بهش داشتم ( فکر کنم php مغزمو خراب کرده :D ) همین مشکل کوچیک تو برنامه نویسی الان دو روزه حل نشده
به قطعه کد بنده توجه کنید :
for i in 0 ..< self.iDcheack.count {
اینجا لوپ در آوردن آرایه به عدد هست
for record in records {
اینجا لوپ مربوط اطلاعات خوندن از دیتابیس هست
let not = StructNotes()
let taskIdinLoop = Int(record["task_id"] as! String)
if taskIdinLoop != self.iDcheack[i] {
print("\(self.iDcheack[i]) ++ \(taskIdinLoop!)")
not.task_id = Int(record["task_id"] as! String)
not.task_title = record["task_title"] as! String
not.task_desc = record["task_desc"] as! String
not.task_done = Int(record["task_done"] as! String)
not.last_modify_time = record["last_modify_time"] as! String
AppDelegate.notes.append(not)
}
}
من دقیقا چاپ می کنم و اون چیزی که می خوام اوکی هست ولی باز هم مثل اینکه باهم مقایسه نمی کنه و داره داده تکراری می یاره شاید بخاطر لوپم باشه که
if taskIdinLoop != self.iDcheack[i]
رو بررسی نمی کنه مثلا اینکه هر دفعه با یک عدد تو آرایه iDcheack بررسی می کنه و چون یکی نیستن باز همه رو می یاره در صورتی که تمام اعداد داخل iDcheack همون آیدی های مربوط به تمام پست هایی هست که الان تو تیبل ویو هست
حلقه ای که من درست کردم بعد از رفرش به شرح زیر هست
for i in 0 ..< records.count {
let not = StructNotes()
if i >= self.iDcheack.count {
not.task_id = Int(records[i]["task_id"] as! String)
not.task_title = records[i]["task_title"] as! String
not.task_desc = records[i]["task_desc"] as! String
not.task_done = Int(records[i]["task_done"] as! String)
not.last_modify_time = records[i]["last_modify_time"] as! String
AppDelegate.notes.append(not)
self.iDcheack.append(not.task_id)
}
خوب این کامل کار می کنه و به زیبایی هر آیتمی که وجود داره رو اضافه می کنه حالا آخر اضافه می کنه که بعدا دنبالش می رم تا حل بشه . من اومدم برای اینکه اگر رکوردی delete شد اون آیتم حذف کنه دو تا راه حل قرار دادم .
- اگر فهمید آیتمی کمه کل تیبل ویو رو رفرش بکنه که متاسفانه نتونستم
- اگر فهمید آیتمی کمه بگرده ببینه کدوم آیدی نیست اون آیتم رو از ایندکس توی تیبل ویو حذف کنه (نتونستم و خیلی سخته )
خوب من تو یک مرحله اومدم این کد زدم :
for i in 0 ..< records.count {
let not = StructNotes()
if i >= self.iDcheack.count {
not.task_id = Int(records[i]["task_id"] as! String)
not.task_title = records[i]["task_title"] as! String
not.task_desc = records[i]["task_desc"] as! String
not.task_done = Int(records[i]["task_done"] as! String)
not.last_modify_time = records[i]["last_modify_time"] as! String
AppDelegate.notes.append(not)
self.iDcheack.append(not.task_id)
}else if records.count < self.iDcheack.count {
if AppDelegate.notes[i].task_id == self.iDcheack[i] && AppDelegate.notes[i].task_id != Int(records[i]["task_id"] as! String) {
//AppDelegate.notes.removeAtIndex(i)
print(self.iDcheack)
print(AppDelegate.notes.count)
print(records.count)
print(self.iDcheack.count)
}
}
}
اگر توجه کرده باشید گفتم اگر تعداد رکورد هام کمتر از تعداد رکورد های id من هست پس چیزی حذف شده و در ادامه از else if اومدم گفتم یک شرط دیگه بزارم که متاسفانه توی شرط نمی ره (( گفتم چیزی باشه توی اپ دلی گیت و آیدی چک باشه ولی توی رکورد جدید ما نباشه . خروجی در اینجا ( اپ دلی گیت ۲ تا(تعداد رکورد های قدیمی ) -- رکورد ۱ کی )
ولی شرط کار نمی کنه
این کد من بیشتر به روش دوم مربوطه ( راه حل دوم ( که منم تره ) ) حالا راه حل اول
چطور می تونم وقتی یک تعداد رکورد کمه که در بالا شرطو نوشتم یعنی همون else if بهش بگم کلا دیتابیس (روی رام - تیبل ویو ) دلیت بعد دوباره جنریت کن .
سوالات دیگه ای هم مطرح می شه :
آیا بعدا تعداد مطالب زیاد شما بهترین روش چی هست؟
دوستان و مخصوصا آقای کاشی زاده آیا سورسی که شما برای مشتریان درست کردید همین منطق هست ؟
این پروسه یک بار درست بشه فکر نکنم دیگه مشکل جدی تو وب سرویس باشه همه چیز رو در بر می گیره جز صفحه بندی و ویرایش یک رکورد
ممنون می شم راهنمایی کنید.
آبدیت :
خوب کدی برای راه حل اول نوشتم که به شرح زیر هست که حل کرد ولی من نمی دونم اینم آیا در آینده برای سرعت اپم مشکل ایجاد می کنه اصلا منطقی هست یا خیر همون esle if به صورت زیر در اومده
else if records.count < self.iDcheack.count {
AppDelegate.notes.removeAll()
self.iDcheack.removeAll()
for record in records {
let not = StructNotes()
not.task_id = Int(record["task_id"] as! String)
not.task_title = record["task_title"] as! String
not.task_desc = record["task_desc"] as! String
not.task_done = Int(record["task_done"] as! String)
not.last_modify_time = record["last_modify_time"] as! String
AppDelegate.notes.append(not)
self.iDcheack.append(not.task_id)
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
