swift code কিভাবে যুক্ত মান সঙ্গে সুইফ্ট enums সমতা পরীক্ষা



swift in banking (10)

আমি দুই সুইফট এননাম মানের সমতা পরীক্ষা করতে চাই। উদাহরণ স্বরূপ:

enum SimpleToken {
    case Name(String)
    case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)
XCTAssert(t1 == t2)

যাইহোক, কম্পাইলার সমতা এক্সপ্রেশন কম্পাইল হবে না:

error: could not find an overload for '==' that accepts the supplied arguments
    XCTAssert(t1 == t2)
    ^~~~~~~~~~~~~~~~~~~

আমি সমতা অপারেটর আমার নিজের overload সংজ্ঞায়িত আছে? আমি স্বেচ্ছাসেবক কম্পাইলার স্বয়ংক্রিয়ভাবে এটি পরিচালনা করবে প্রত্যাশা ছিল, Scala এবং Ocaml মত অনেক।


Answer #1

এখানে অন্য বিকল্প। এটি প্রধানত অন্যের মতোই তবে এটি if case সিনট্যাক্স ব্যবহার করে নেস্টেড সুইচ বিবৃতিগুলি এড়ানো হয়। আমি মনে করি এটি আরও সামান্য পাঠযোগ্য (/ bearable) এবং এটি ডিফল্ট ক্ষেত্রে পুরোপুরি এড়ানো সুবিধা রয়েছে।

enum SimpleToken: Equatable {
    case Name(String)
    case Number(Int)
}
extension SimpleToken {
    func isEqual(st: SimpleToken)->Bool {
        switch self {
        case .Name(let v1): 
            if case .Name(let v2) = st where v1 == v2 { return true }
        case .Number(let i1): 
            if case .Number(let i2) = st where i1 == i2 { return true }
        }
        return false
    }
}

func ==(lhs: SimpleToken, rhs: SimpleToken)->Bool {
    return lhs.isEqual(rhs)
}

let t1 = SimpleToken.Number(1)
let t2 = SimpleToken.Number(2)
let t3 = SimpleToken.Name("a")
let t4 = SimpleToken.Name("b")

t1 == t1  // true
t1 == t2  // false
t3 == t3  // true
t3 == t4  // false
t1 == t3  // false

Answer #2

আপনি সুইচ ব্যবহার করে তুলনা করতে পারেন

enum SimpleToken {
    case Name(String)
    case Number(Int)
}

let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)

switch(t1) {

case let .Number(a):
    switch(t2) {
        case let . Number(b):
            if a == b
            {
                println("Equal")
        }
        default:
            println("Not equal")
    }
default:
    println("No Match")
}

Answer #3

Mbpro এর উত্তরটি প্রসারিত করে, এখানে আমি কীভাবে কিছু প্রান্তের সাথে সম্পর্কিত মানগুলির সাথে দ্রুত গতিশীল মাপের সমতা পরীক্ষা করার জন্য সেই পদ্ধতিটি ব্যবহার করেছি।

অবশ্যই আপনি একটি সুইচ স্টেটমেন্ট করতে পারেন, তবে কখনও কখনও এক লাইনের জন্য একটি মান যাচাই করা খুব ভাল। আপনি এভাবে এটি করতে পারেন:

// NOTE: there's only 1 equal (`=`) sign! Not the 2 (`==`) that you're used to for the equality operator
// 2nd NOTE: Your variable must come 2nd in the clause

if case .yourEnumCase(associatedValueIfNeeded) = yourEnumVariable {
  // success
}

যদি আপনি বিভাগে দুটি শর্ত তুলনা করতে চান তবে আপনাকে && অপারেটরের পরিবর্তে কমা ব্যবহার করতে হবে:

if someOtherCondition, case .yourEnumCase = yourEnumVariable {
  // success
}

Answer #4

গ্রহণযোগ্য উত্তর তুলনা করার ক্ষেত্রে 'সুবিধা', যেটি 'প্রধান' সুইচ স্টেটমেন্টে কোনও 'ডিফল্ট' কেস নেই, তাই যদি আপনি অন্যান্য ক্ষেত্রে আপনার Enum প্রসারিত করেন তবে কম্পাইলার আপনাকে বাকি কোডটি আপডেট করতে বাধ্য করবে।

enum SimpleToken: Equatable {
    case Name(String)
    case Number(Int)
}
extension SimpleToken {
    func isEqual(st: SimpleToken)->Bool {
        switch self {
        case .Name(let v1):
            switch st {
            case .Name(let v2): return v1 == v2
            default: return false
            }
        case .Number(let i1):
            switch st {
            case .Number(let i2): return i1 == i2
            default: return false
            }
        }
    }
}


func ==(lhs: SimpleToken, rhs: SimpleToken)->Bool {
    return lhs.isEqual(rhs)
}

let t1 = SimpleToken.Number(1)
let t2 = SimpleToken.Number(2)
let t3 = SimpleToken.Name("a")
let t4 = SimpleToken.Name("b")

t1 == t1  // true
t1 == t2  // false
t3 == t3  // true
t3 == t4  // false
t1 == t3  // false

Answer #5

কমা দিয়ে if case ব্যবহার করে অন্য পদ্ধতি, সুইফ্ট 3 কাজ করে যা:

enum {
  case kindOne(String)
  case kindTwo(NSManagedObjectID)
  case kindThree(Int)

  static func ==(lhs: MyEnumType, rhs: MyEnumType) -> Bool {
    if case .kindOne(let l) = lhs,
        case .kindOne(let r) = rhs {
        return l == r
    }
    if case .kindTwo(let l) = lhs,
        case .kindTwo(let r) = rhs {
        return l == r
    }
    if case .kindThree(let l) = lhs,
        case .kindThree(let r) = rhs {
        return l == r
    }
    return false
  }
}

এইভাবে আমি আমার প্রকল্পে লিখেছিলাম। কিন্তু আমি মনে করতে পারছি না যেখানে আমি ধারণা পেয়েছি। (আমি এখন শুধু googled কিন্তু যেমন ব্যবহার দেখতে না।) কোন মন্তব্য প্রশংসা করা হবে।


Answer #6

Enums জন্য, না structs জন্য কোন কম্পাইলার উত্পাদিত সমতা অপারেটর মনে হয়।

"উদাহরণস্বরূপ, জটিল জটিল ডেটা মডেলের প্রতিনিধিত্ব করার জন্য আপনি যদি নিজের শ্রেণী বা গঠন তৈরি করেন তবে উদাহরণস্বরূপ, সেই বর্গ বা কাঠামোর জন্য" সমান "এর অর্থ এমন কিছু নয় যা সুইফ্ট আপনার জন্য অনুমান করতে পারে।" [1]

সমতা তুলনা বাস্তবায়ন করার জন্য, কেউ এমন কিছু লিখবে:

@infix func ==(a:SimpleToken, b:SimpleToken) -> Bool {
    switch(a) {

    case let .Name(sa):
        switch(b) {
        case let .Name(sb): return sa == sb
        default: return false
        }

    case let .Number(na):
        switch(b) {
        case let .Number(nb): return na == nb
        default: return false
        }
    }
}

[1] https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-XID_43 এ "সমানতা অপারেটরগুলি" দেখুন


Answer #7

আমি একক টেস্ট কোডে এই সহজ পদ্ধতি ব্যবহার করছি:

extension SimpleToken: Equatable {}
func ==(lhs: SimpleToken, rhs: SimpleToken) -> Bool {
    return String(stringInterpolationSegment: lhs) == String(stringInterpolationSegment: rhs)
}

এটা তুলনা সঞ্চালন স্ট্রিং interpolation ব্যবহার করে। আমি উত্পাদন কোড জন্য এটি সুপারিশ করবে না, কিন্তু এটি সংক্ষিপ্ত এবং ইউনিট পরীক্ষার জন্য কাজ করে।


Answer #8

অন্যরা যেমন উল্লেখ করেছে, সুইফ্ট স্বয়ংক্রিয়ভাবে প্রয়োজনীয় সমতা অপারেটরগুলিকে সংশ্লেষ করে না। আমাকে একটি ক্লিনার (আইএমএইচও) বাস্তবায়ন প্রস্তাব করা যাক, যদিও:

enum SimpleToken: Equatable {
    case Name(String)
    case Number(Int)
}

public func ==(lhs: SimpleToken, rhs: SimpleToken) -> Bool {
    switch (lhs, rhs) {
    case let (.Name(a),   .Name(b)),
         let (.Number(a), .Number(b)):
      return a == b
    default:
      return false
    }
}

এটি আদর্শ থেকে অনেক দূরে - সেখানে অনেক পুনরাবৃত্তি আছে - তবে কমপক্ষে আপনার যদি নীচের বিবৃতিগুলির সাথে নেস্টেড সুইচ করতে হয় না।


Answer #9

Equatable বাস্তবায়ন একটি overkill Equatable হয়। আপনি অনেক ক্ষেত্রে এবং অনেক বিভিন্ন পরামিতি সঙ্গে জটিল এবং বড় enum আছে কল্পনা। এই পরামিতি সব Equatable বাস্তবায়িত আছে, হবে। এ ছাড়া, কে বলেছে যে আপনি এনমের ক্ষেত্রে তুলনা করছেন সব কিছুই বা কিছুই ভিত্তিতে? আপনি কিভাবে মূল্য পরীক্ষার জন্য এবং শুধুমাত্র একটি নির্দিষ্ট enum পরামিতি stubbed হয়? আমি দৃঢ়ভাবে সহজ পদ্ধতির পরামর্শ চাই, যেমন:

if case .NotRecognized = error {
    // Success
} else {
    XCTFail("wrong error")
}

... বা পরামিতি মূল্যায়ন ক্ষেত্রে:

if case .Unauthorized401(_, let response, _) = networkError {
    XCTAssertEqual(response.statusCode, 401)
} else {
    XCTFail("Unauthorized401 was expected")
}

এখানে আরও বিস্তারিত বিবরণ খুঁজুন: https://mdcdeveloper.wordpress.com/2016/12/16/unit-testing-swift-enums/


Answer #10

আরেকটি বিকল্প ক্ষেত্রে স্ট্রিং উপস্থাপনা তুলনা করা হবে:

XCTAssert(String(t1) == String(t2))

উদাহরণ স্বরূপ:

let t1 = SimpleToken.Number(123) // the string representation is "Number(123)"
let t2 = SimpleToken.Number(123)
let t3 = SimpleToken.Name("bob") // the string representation is "Name(\"bob\")"

String(t1) == String(t2) //true
String(t1) == String(t3) //false




swift