আমি switch
সুইফটে বিবৃতিগুলির সাথে পরিচিত , তবে কীভাবে এই কোডের এই টুকরোটি প্রতিস্থাপন করব তা অবাক করে switch
:
if someVar < 0 {
// do something
} else if someVar == 0 {
// do something else
} else if someVar > 0 {
// etc
}
আমি switch
সুইফটে বিবৃতিগুলির সাথে পরিচিত , তবে কীভাবে এই কোডের এই টুকরোটি প্রতিস্থাপন করব তা অবাক করে switch
:
if someVar < 0 {
// do something
} else if someVar == 0 {
// do something else
} else if someVar > 0 {
// etc
}
উত্তর:
এখানে একটি পদ্ধতির। ধরে someVar
নেওয়া একটি Int
বা অন্য Comparable
, আপনি বিকল্পভাবে একটি নতুন ভেরিয়েবলের জন্য অপারেন্ড নির্ধারণ করতে পারেন। আপনি where
কীওয়ার্ডটি ব্যবহার করতে চাইলেও এটি আপনাকে এটির সুযোগ দেয় :
var someVar = 3
switch someVar {
case let x where x < 0:
print("x is \(x)")
case let x where x == 0:
print("x is \(x)")
case let x where x > 0:
print("x is \(x)")
default:
print("this is impossible")
}
এটি কিছুটা সহজ করা যায়:
switch someVar {
case _ where someVar < 0:
print("someVar is \(someVar)")
case 0:
print("someVar is 0")
case _ where someVar > 0:
print("someVar is \(someVar)")
default:
print("this is impossible")
}
আপনি where
পরিসীমা ম্যাচিংয়ের সাথে কীওয়ার্ডটি পুরোপুরি এড়াতে পারেন :
switch someVar {
case Int.min..<0:
print("someVar is \(someVar)")
case 0:
print("someVar is 0")
default:
print("someVar is \(someVar)")
}
default: fatalError()
সম্ভাব্য লজিক ত্রুটিগুলি দ্রুত সনাক্ত করার পরামর্শ দিই ।
assertionFailure
একটি নিরাপদ বিকল্প বলে মনে হচ্ছে, বিশেষত দলে কাজ করার সময়।
সুইফট 5 এর সাহায্যে, আপনার যদি বিবৃতিটি প্রতিস্থাপন করতে আপনি নীচের একটি স্যুইচ চয়ন করতে পারেন।
PartialRangeFrom
এবং সাথে স্যুইচ ব্যবহার করে UsingPartialRangeUpTo
let value = 1
switch value {
case 1...:
print("greater than zero")
case 0:
print("zero")
case ..<0:
print("less than zero")
default:
fatalError()
}
ClosedRange
এবং সাথে স্যুইচ ব্যবহার করেRange
let value = 1
switch value {
case 1 ... Int.max:
print("greater than zero")
case Int.min ..< 0:
print("less than zero")
case 0:
print("zero")
default:
fatalError()
}
let value = 1
switch value {
case let val where val > 0:
print("\(val) is greater than zero")
case let val where val == 0:
print("\(val) is zero")
case let val where val < 0:
print("\(val) is less than zero")
default:
fatalError()
}
_
let value = 1
switch value {
case _ where value > 0:
print("greater than zero")
case _ where value == 0:
print("zero")
case _ where value < 0:
print("less than zero")
default:
fatalError()
}
RangeExpression
প্রোটোকলের ~=(_:_:)
অপারেটরের সাথে স্যুইচ ব্যবহার করাlet value = 1
switch true {
case 1... ~= value:
print("greater than zero")
case ..<0 ~= value:
print("less than zero")
default:
print("zero")
}
Equatable
প্রোটোকলের ~=(_:_:)
অপারেটরের সাথে স্যুইচ ব্যবহার করাlet value = 1
switch true {
case value > 0:
print("greater than zero")
case value < 0:
print("less than zero")
case 0 ~= value:
print("zero")
default:
fatalError()
}
PartialRangeFrom
, PartialRangeUpTo
এবং RangeExpression
এর contains(_:)
পদ্ধতি ব্যবহার করেlet value = 1
switch true {
case (1...).contains(value):
print("greater than zero")
case (..<0).contains(value):
print("less than zero")
default:
print("zero")
}
0.1
একটি মারাত্মক ত্রুটি ছোঁড়া কারণ 1...
কভার শুধুমাত্র 1. থেকে নম্বর সুতরাং এই সমাধান শুধুমাত্র যদি কাজ করে value
একটি হল Int
কিন্তু যে বিপজ্জনক পরিবর্তনশীল টাইপ কোনো কম্পাইলার ত্রুটি ছাড়া কার্যকারিতা বিরতি পরিবর্তন যদি কারণ।
switch
বিবৃতি, অধীন ফণা, ব্যবহার ~=
অপারেটর। আমার স্নাতকের:
let x = 2
switch x {
case 1: print(1)
case 2: print(2)
case 3..<5: print(3..<5)
default: break
}
এটির জন্য ডিজুগার:
if 1 ~= x { print(1) }
else if 2 ~= x { print(2) }
else if 3..<5 ~= x { print(3..<5) }
else { }
আপনি যদি স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্সের দিকে তাকান তবে এটি আপনাকে কী করতে হবে তা ঠিক বলতে ~=
পারে : অন্তর্ভুক্তটি হ'ল পরিসীমা-মেলা এবং সমতুল্য জিনিসগুলির জন্য সমান equ (অন্তর্ভুক্ত নয় এনাম-কেস ম্যাচিং, যা একটি ভাষা বৈশিষ্ট্য, স্টাড লিবিবের কোনও ফাংশনের চেয়ে)
আপনি দেখতে পাবেন যে এটি বাম-পাশের কোনও সোজা বুলেটিনের সাথে মেলে না। এই ধরণের তুলনার জন্য আপনার একটি বিবৃতি যুক্ত করতে হবে।
যদি না ... আপনি ~=
নিজে অপারেটরটি ওভারলোড করেন । (এটি সাধারণত প্রস্তাবিত নয় ) একটি সম্ভাবনা হ'ল এরকম কিছু হবে:
func ~= <T> (lhs: T -> Bool, rhs: T) -> Bool {
return lhs(rhs)
}
সুতরাং এটি এমন কোনও ফাংশনটির সাথে মেলে যা ডানদিকে তার প্যারামিটারে বামদিকে একটি বুলিয়ান দেয়। আপনি যে ধরণের জিনিসটির জন্য এটি ব্যবহার করতে পারেন তা এখানে:
func isEven(n: Int) -> Bool { return n % 2 == 0 }
switch 2 {
case isEven: print("Even!")
default: print("Odd!")
}
আপনার ক্ষেত্রে, আপনার কাছে এমন একটি বিবৃতি থাকতে পারে যা দেখতে এটির মতো দেখাচ্ছে:
switch someVar {
case isNegative: ...
case 0: ...
case isPositive: ...
}
তবে এখন আপনাকে নতুন isNegative
এবং isPositive
কার্যকারিতা সংজ্ঞায়িত করতে হবে । আপনি যদি কিছু অপারেটরকে ওভারলোড না করেন ...
আপনি সাধারণ ইনফিক্স অপারেটরগুলিকে তরকারী উপসর্গ বা পোস্টফিক্স অপারেটরগুলি ওভারলোড করতে পারেন। এখানে একটি উদাহরণ:
postfix operator < {}
postfix func < <T : Comparable>(lhs: T)(_ rhs: T) -> Bool {
return lhs < rhs
}
এটি এর মতো কাজ করবে:
let isGreaterThanFive = 5<
isGreaterThanFive(6) // true
isGreaterThanFive(5) // false
পূর্ববর্তী ফাংশনটির সাথে এটি একত্রিত করুন এবং আপনার সুইচ স্টেটমেন্টটি দেখতে দেখতে এটি দেখতে পারে:
switch someVar {
case 0< : print("Bigger than 0")
case 0 : print("0")
default : print("Less than 0")
}
এখন, আপনার সম্ভবত অনুশীলনে এই ধরণের জিনিস ব্যবহার করা উচিত নয়: এটি কিছুটা দোষজনক। আপনি (সম্ভবত) বয়ানটি স্টিকিংয়ের চেয়ে ভাল where
। যা বলেছিল, এর স্যুইচ স্টেটমেন্ট প্যাটার্ন
switch x {
case negative:
case 0:
case positive:
}
অথবা
switch x {
case lessThan(someNumber):
case someNumber:
case greaterThan(someNumber):
}
এটি বিবেচনা করার মতো বলে মনে হচ্ছে এটি যথেষ্ট সাধারণ।
যেহেতু কেউ ইতিমধ্যেই পোস্ট করেছে case let x where x < 0:
এখানে যেখানে একটি বিকল্প নেই someVar
একটি হল Int
।
switch someVar{
case Int.min...0: // do something
case 0: // do something
default: // do something
}
এবং এখানে যেখানে একটি বিকল্প নেই someVar
একটি হল Double
:
case -(Double.infinity)...0: // do something
// etc
রেঞ্জগুলির সাথে এটি দেখতে কেমন লাগে
switch average {
case 0..<40: //greater or equal than 0 and less than 40
return "T"
case 40..<55: //greater or equal than 40 and less than 55
return "D"
case 55..<70: //greater or equal than 55 and less than 70
return "P"
case 70..<80: //greater or equal than 70 and less than 80
return "A"
case 80..<90: //greater or equal than 80 and less than 90
return "E"
case 90...100: //greater or equal than 90 and less or equal than 100
return "O"
default:
return "Z"
}
<0
অভিব্যক্তি (আর?) কাজ করে না তাই আমি এই সঙ্গে শেষ পর্যন্ত:
সুইফট 3.0:
switch someVar {
case 0:
// it's zero
case 0 ..< .greatestFiniteMagnitude:
// it's greater than zero
default:
// it's less than zero
}
X_MAX
দ্বারা প্রতিস্থাপিত হয়েছে .greatestFiniteMagnitude
, অর্থাত্ Double.greatestFiniteMagnitude
, CGFloat.greatestFiniteMagnitude
ইত্যাদি সুতরাং সাধারণত, আপনি শুধু করতে পারি না case 0..< .greatestFiniteMagnitude
ধরণ থেকে someVar
ইতিমধ্যে পরিচিত হয়
var timeLeft = 100
switch timeLeft {case 0...<=7200: print("ok") default:print("nothing") }
কেন <=
স্বীকৃত নয়? আমি যদি এটি সমান না করে লিখি তবে এটি কাজ করে। ধন্যবাদ
case 0...7200:
অপারেটর <=
একটি তুলনামূলক অপারেটর। একটি স্যুইচে আপনি কেবল ব্যাপ্তি অপারেটর ব্যবহার করতে পারেন (দস্তাবেজগুলি দেখুন)
someVar
ছিল Int
এবং আমাকে Double(
কিছুটা করতে হয়েছিল)
খুশি যে সুইফট 4 সমস্যাটির সমাধান করে:
3-এ একটি কার্যকারণ হিসাবে আমি করেছি:
switch translation.x {
case 0..<200:
print(translation.x, slideLimit)
case -200..<0:
print(translation.x, slideLimit)
default:
break
}
কাজ কিন্তু আদর্শ নয়