آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

واردن کردن مجموعه از داده ها به یک متغیر در یک حلقه for

شهریار توکلی  10 سال پیش  10 سال پیش
0 0

درود خدمت شما . به یک مشکلی برخورد کردم که حل نتونستم بکنمش 

فکر بکنید یک متغییر در بالای کلاس تعریف کردم به به صورت زیر

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()
        }

تشکر 

0 0
نکته ای هم اینجا مهمه چرا انقدر سو ایفت به مدل های عدد مشکل می گیره به عنوان مثل اودم این متغییر شکل گرد بعد نمی تونی int با [int] بررسی کنه . (10 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
کاشی زاده  10 سال پیش
+1 0

سلام ،
اگر قصد دارید که داده ای رو در آرایه اضافه کنید ، بخش آموزش کار با آرایه ها را مطالعه کنید توضیحات لازم در رابطه با افزودن مقدار به آرایه توضیح داده شده، اما به طور کل از دستور زیر برای افزودن به آرایه میتونید استفاده کنید :

 anArray.append("This String")

حالا اگر موفق شدید که داده ها را به آرایه اضافه کنید بعد میتونید برید سراغ مرحله بعدی که مربوط به ریفرش شدن اطلاعات لیست  هست .

سوال بعدی که در بخش نظرات مطرح کردید که چرا Swift به مقایسه Int با [Int] مشکل میگیره ، به خاطر این هست که شما متغیری از جنس Int را با آرایه ای از این نوع نمیتوانید مقایسه کنید ، باید ابتدا با استفاده از حلقه for داده های داخل آرایه را تک تک بیرون بکشید و در همان حلقه مقایسه را انجام دهید .

0 0
درود تشکر از شما . آقای کاشی زاده anArray باید نوعش چی باشه منظورم به عنوان پراپرتی وقتی بالا تعریفش می کنیم ؟ چون من append هم می کنم ارور می گیره متاسفانه . (10 سال پیش)
پاسخ به سوال 
کاشی زاده  10 سال پیش
+1 0

نحوه تعریف کردن آرایه هم به این شکل هست 

 var number: [Int] = []

ابتدا کلمه کلیدی var که نشان دهنده تعریف یک متغیر است ، سپس نام آرایه و بعد از آن نوع آرایه را مشخص میکنیم مثلا در دستور بالا من آرایه ای از نوع Int ایجاد کردم که میتونه اعداد رو داخل خودش نگه داره .

پاسخ به سوال 
شهریار توکلی  10 سال پیش
0 0

واقعا آقای کاشی زاده کل این پروژه رو شما درست کردی و من واقعا شرمندم . درست فرمودید بلخره تونستم یک داده ای رو در هرجا نیاز دارم استفاده کنم یعنی واقعا نیاز بهش داشتم ( فکر کنم  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 همون آیدی های مربوط به تمام پست هایی هست که الان تو تیبل ویو هست

0 0
به احتمال ۱۰۰ درصد بخاطر لوپ هست چون دوباره بررسی می کنه این مشکل پیش می یاد تو نمایش نتایج هم جابه جا شدن مشخصه ولی عوض می کنم بازم جواب نمی ده یکی از لوپ های record رو حذف کردم ارور می ده متاسفانه راهی به نظرم نمی رسه (10 سال پیش)
0 0
از دستور print استفاده کنید و مقادیر را چاپ کنید ، همچنین بررسی کنید ببنید داخل if وارد میشه یا نه و اگر نمیشه چه مقداری باعث این مشکل شده . (10 سال پیش)
0 0
درود آقای کاشی زاده . بلخره با مشورت با دوستان فهمیدم که چندین مشکل داره در حلقه من ۱. اینکه دوبار دارم لوپ می کنم - لوپ رو برعکس نوشتم . الان مطالب جدید بعد از رفرش اضافه می شه فقط می مونه اگر رکوردی حذف شد بعد از رفرش نمایش نده و همینطور مونده اگر به روز شد بعد از رفرش تغییر بکنه . کل حلقه رو عوض کردم . (10 سال پیش)
پاسخ به سوال 
شهریار توکلی  10 سال پیش
0 0

حلقه ای که من درست کردم بعد از رفرش به شرح زیر هست

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 شد اون آیتم حذف کنه دو تا راه حل قرار دادم .

  1. اگر فهمید آیتمی کمه کل تیبل ویو رو رفرش بکنه که متاسفانه نتونستم 
  2. اگر فهمید آیتمی کمه بگرده ببینه کدوم آیدی نیست اون آیتم رو از ایندکس توی تیبل ویو حذف کنه (نتونستم و خیلی سخته )

 

خوب من تو یک مرحله اومدم این کد زدم  :

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)
                        }
                        
                        
                        
                    }
0 0
دوستان کسی نظری در رابطه با کد ها نداره ؟ و راه حل من ؟ (10 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .