নতুন অ্যারে তৈরি
var array = [TYPE]()
অ্যারে লেন্থ
array.count
i তম ইনডেক্সের মান বের করা
array[i]
অ্যারেতে কোন মান আছে কিনা চেক করা
array.contains(value)
অ্যারের কোন ইলিমেন্টের ইনডেক্স বের করা
let i = array.firstIndex(of: value) অপশনাল রিটার্ন করবে, কারণ value অ্যারেতে নাও থাকতে পারে!
সর্ট করা (অ্যাসেন্ডিং অর্ডার)
array.sorted()
সর্ট করা (ডিসেন্ডিং অর্ডার)
array.sort { $0 > $1 }
তৈরি করা
var dict = [KeyType: ValueType]()
ডিকশনারি ইলিমেন্ট যোগ করা
dict[key] = value
ইলিমেন্ট বাদ দেয়া
dict.removeValue(forKey: key)
খালি করে দেয়া
dict.removeAll
GET
URLSession.shared.dataTask(with: url) { (data, response, error) in print(data) }
রিমোট URL থেকে ইমেজ লোড করা
DispatchQueue.global().async { guard let imageData = try? Data(contentsOf: imageURL) else { return }; let image = UIImage(data: imageData) }
ইমেজ নেম থেকে লোড করা
Image("hello_world ")
ইমেজে সিস্টেম আইকন ইউস করা
Image(systemName: "cloud.heavyrain.fill")
ইমেজে স্টাইল যোগ করা
Image("hello_world").resizable().aspectRatio(contentMode: .fill).padding(.bottom)
কাজ কি?
সবগুলোই অবজার্ভার প্যাটার্ন ফলো করে। ডাইনামিক বাইন্ডিং এ ব্যবহার করা যায়।
পার্থক্য
পার্থক্য স্কোপে আর কি ধরণের ডেটার সাথে ব্যবহার করা যায় তার ওপর। State -> ভিউ অনলি স্কোপ, প্রিমিটিভ/ সিম্পল টাইপ ইউস করা যায়। ObservedObject -> কাস্টম টাইপ ইউস করা যায়, এবং এক ভিউ থেকে আরেক ভিউ তে ডেটা পাস করতেও ইউস করা যায়( টু ওয়ে বাইন্ডিং)। EnvironmentObject -> পুরো অ্যাপ্লিকেশন স্কোপে ইউস করা যায়, সিম্পল বা কাস্টম দুই টাইপের সাথেই ইউস করা যায়।
প্রোজেক্টে কোকোয়াপড ইনিশিয়ালাইজ করা
pod init
সব POD ইন্সটল করা
pod install
স্ট্রিং ইন্টারপোলেশন
let str = "This is some \(value)"
স্ট্রিং এর লেন্থ বের করা
str.count
স্ট্রিং এর i তম ইনডেক্সের মান বের করা
str[ str.index(str.startIndex, offsetBy: i) ]
নতুন স্ট্রিং অ্যাপেন্ড করা
str.append(newString)
লোয়ারকেস করা
str.lowercased()
আপারকেস করা
str.uppercased()
ফোর্স আনর্যাপ করা (আনসেইফ)
let unwrapped = optionalVar!
nil কোলেসিং, অপশনালে nil পাওয়া গেলে ডিফল্ট মান দেয়া
let responseCode = code ?? 404
সেইফ আনর্যাপিং
উদাহরণ ১ - if let unwrapped = optVar { // do something} উদাহরণ ২ - guard let unwrapped = optVar else { return }
guard let এবং if let এর তফাৎ
guard let যে ব্লকে থাকে, nil পেলে সে ব্লক এক্সিট করে। if let ব্লক এক্সিট করে না। অপশনালের মান বাদে যদি ব্লকের কাজ না হয় তাহলে guard let ব্যবহার করাই উত্তম।
JSONDecoder দিয়ে ডিকোড করা - ১
struct হিসেবে মডেল টাইপ বানাতে হবে
JSONDecoder দিয়ে ডিকোড করা - ২
do { let json = try JSONDecoder().decode(ModelStruct.self, from: data) } catch {}
একটা ভিউতে কয়টা সাবভিউ থাকবে?
একটা ভিউ থেকে একটাই সাব ভিউ রিটার্ন করা যাবে। এর বেশি চাইলে নেস্টেড চিলড্রেন হিসাবে রিটার্ন করতে হবে।
ইমেজে গোলাকার ফ্রেম দেয়া
Image(image).clipShape(Circle())
গোলাকার ফ্রেমে ওভারলে দেয়া
উদাহরণঃ ২ উইডথের গ্রে ওভারলে- Image(image).clipShape(Circle()).overlay(Circle().stroke(Color.gray, lineWidth: 2))
দুই ভিউ এর মাঝে সম্পূর্ণ ফাঁকা জায়গা ব্ল্যাংক স্পেস হিসেবে ইউস করা
Spacer()
ভিউ কেমন স্পেস খাবে সেজন্য প্রায়োরিটি সেট করা
layoutPriority(priority) ডিফল্ট ভ্যালু হচ্ছে 0, কোন ভিউকে ডমিনেন্টলি দেখাতে চাইলে: 1, কোন কারণে স্ক্রিনে স্পেস কমে গেলে ডমিনেন্ট ভিউ বাদে বাকিগুলো ক্লিপ করে দিবে
সেইফ এরিয়া ইগনোর করে পুরো স্ক্রিন জুড়ে ভিউ সেট করা
.edgesIgnoringSafeArea(.all)
ভিউ রোটেট করা
Text("Up we go!").rotationEffect(.degrees(angle))
বর্ডার দেয়া
উদাহরণ লাল বর্ডার - .border(Color.red, width: 4)
VStack - ভার্টিকালি সাজানো
VStack {Text("Hello"); Text("World")}
HStack - হরাইজন্টালি সাজানো
HStack {Text("Hello"); Text("World")}
ZStack - ওভারল্যাপ
ZStack {Image("hello"); Text("World")}