কিভাবে একটি এনাম সুইফটে একটি প্রোটোকলের সাথে সঙ্গতিপূর্ণ করবেন?


97

সুইফ্ট ডকুমেন্টেশন বলছে যে ক্লাস , স্ট্রাক্ট এবং এনামগুলি সমস্তই প্রোটোকলের সাথে সামঞ্জস্য করতে পারে এবং আমি এমন একটি পয়েন্টে পৌঁছতে পারি যেখানে তারা সকলে মিলে। তবে আমি ক্লাস এবং কাঠামোর উদাহরণগুলির মতো আচরণ করার জন্য এনামকে পেতে পারি না :

protocol ExampleProtocol {
    var simpleDescription: String { get set }
    mutating func adjust()
}

class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105

    func adjust() {
        simpleDescription += " Now 100% adjusted."
    }
}

var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription

struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"

    mutating func adjust() {
        simpleDescription += " (adjusted)"
    }
}

var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

enum SimpleEnum: ExampleProtocol {
    case Base

    var simpleDescription: String {
        get {
            return "A Simple Enum"
        }
        set {
            newValue
        }
    }

    mutating func adjust() {
        self.simpleDescription += ", adjusted"
    }
}

var c = SimpleEnum.Base
c.adjust()
let cDescription = c.simpleDescription

simpleDescriptionকল করার ফলে কীভাবে পরিবর্তন ঘটানো যায় তা আমি খুঁজে পাইনি adjust()। আমার উদাহরণটি অবশ্যই স্পষ্টভাবে তা করবে না কারণ গ্রাহকটির একটি হার্ড-কোডড মান রয়েছে তবে আমি কীভাবে সেই মানটির সাথে মান simpleDescriptionমেনে চলব ExampleProtocol?

উত্তর:


157

এটি আমার চেষ্টা:

protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}

enum ExampleEnum : ExampleProtocol {
    case Base, Adjusted

    var simpleDescription: String {
        return self.getDescription()
    }

    func getDescription() -> String {
        switch self {
        case .Base:
            return "A simple description of enum"
        case .Adjusted:
            return "Adjusted description of enum"
        }
    }

    mutating func adjust() {
        self = ExampleEnum.Adjusted
    }
}

var c = ExampleEnum.Base
c.adjust()
let cDescription = c.simpleDescription

এটি প্রোটোকলটিকে সন্তুষ্ট করে তবে একটি এনাম হিসাবে এখনও উপলব্ধি করে। ভাল কাজ!
ডেভিড জেমস

4
অসাধারণ! সামঞ্জস্যপূর্ণ রাষ্ট্র তৈরি করার আমার ধারণা ছিল, তবে আমার কাছে এমনটি ঘটেনি যে আমি পরিবর্তন করতে পারি the সামঞ্জস্য পদ্ধতিতে সামঞ্জস্য। ধন্যবাদ!
অ্যাড্রিয়ান হ্যারিস ক্রাউন

দুর্দান্ত পয়েন্টার। এই এক উপর কিছুটা আটকে ছিল। যদিও একটি প্রশ্ন: আপনি অকার্যকর ফাংশনটিতে শূন্যতার ফেরতের মান যুক্ত করেছেন এমন কোনও কারণ?
jpittman

@jpittman কারণ adjustফাংশন আয় Voidমধ্যে ExampleProtocol, এটা ঠিক মতো ব্যবহার করে একই mutating func adjust()। আপনি যদি adjustকোনও রিটার্নের টাইপ পেতে চান তবে আপনি প্রোটোকলটি এটিকে
অ্যাঞ্জেলো

4
সিনট্যাক্স ত্রুটিটি সংশোধন করার জন্য উত্তর সম্পাদনা করতে পারেনি, এটি একটি বিন্দু অনুপস্থিত, হওয়া উচিতcase .Base:
জন দো

45

এটি আমার গ্রহণ এখানে।

যেহেতু এটি একটি enumএবং একটি নয় class, আপনাকে আলাদা আলাদা (টিএম) ভাবতে হবে: আপনার পরিবর্তনের "রাষ্ট্র" enum(@ হু-কিআং দ্বারা চিহ্নিত হিসাবে ) এটি পরিবর্তন করতে হবে your

enum SimpleEnumeration: ExampleProtocol {
  case Basic, Adjusted

  var description: String {
    switch self {
    case .Basic:
      return "A simple Enumeration"
    case .Adjusted:
      return "A simple Enumeration [adjusted]"
    }
  }

  mutating func adjust()  {
    self = .Adjusted
  }
}

var c = SimpleEnumeration.Basic
c.description
c.adjust()
c.description

আশা করি এইটি কাজ করবে.


আমি এনাম নিজেই আপনার গ্রহণের সাথে এবং আপনার দেওয়া কোডের সাথে একমত। সুন্দর

4
এই উত্তরটি স্বীকৃত উত্তরটির চেয়ে ভাল এবং বেশি সংক্ষিপ্ত।
রিকার্ডো সানচেজ-সায়েজ

4
আপনি কেবল সরল গণনাটি সরিয়ে ফেলতে পারেন এমন একটি পার্শ্ব নোট A যদি গণনার নামটি কখনও পরিবর্তিত হয় তবে এটি চুল্লি করা কম জিনিস।
শাওলো

হ্যাঁ, এটি আরও ভাল। ধন্যবাদ
অর্জুন কালিদাস

এটি প্রদত্ত প্রোটোকলের সাথে সামঞ্জস্য নয় যদিও
ব্যারি

11

এখানে অন্য পন্থাটি রয়েছে, সেই বিন্দু পর্যন্ত ট্যুর থেকে প্রাপ্ত জ্ঞানকে ব্যবহার করে *

enum SimpleEnumeration: String, ExampleProtocol {
    case Basic = "A simple enumeration", Adjusted = "A simple enumeration (adjusted)"

    var simpleDescription: String {
        get {
            return self.toRaw()
        }
    }

    mutating func adjust() {
        self = .Adjusted
    }
}

var c = SimpleEnumeration.Basic
c.adjust()
let cDescription = c.simpleDescription

আপনি যদি adjust()টগল হিসাবে কাজ করতে চান (যদিও এর প্রস্তাব দেওয়ার মতো কিছুই নেই) তবে ব্যবহার করুন:

mutating func adjust() {
    switch self {
    case .Basic:
        self = .Adjusted
    default:
        self = .Basic
    }
}

* (যদিও এটি কোনও রিটার্নের ধরণ এবং প্রোটোকল কীভাবে নির্দিষ্ট করবেন তা স্পষ্টভাবে উল্লেখ করা হয়নি )


4
আমি মনে করি এই পন্থাটি সম্ভবত গুচ্ছগুলির মধ্যে সেরা। দ্রুত আপডেটটি হ'ল সরল বিবরণটি স্ব.আরওয়ালিউকে ফিরিয়ে দেওয়া উচিত
জাস্টিন লেভি শীতকাল

7

এখানে এমন একটি সমাধান রয়েছে যা বর্তমান এনাম মানটি পরিবর্তন করে না, তবে পরিবর্তে তাদের উদাহরণগুলি মান দেয় (কেবলমাত্র যদি এটি কারওরূপে কার্যকর হয় তবে)।

enum ProtoEnumeration : ExampleProtocol {
    case One(String)
    case Two(String)

    var simpleDescription: String {
        get {
            switch self {
            case let .One(desc):
                return desc
            case let .Two(desc):
                return desc
            }
        }
    }
    mutating func adjust() {
        switch self {
        case let .One(desc):
            self = .One(desc + ", adjusted 1")
        case let .Two(desc):
            self = .Two(desc + ", adjusted 2")
        }
    }
}

var p = ProtoEnumeration.One("test")
p.simpleDescription
p.adjust()
p.simpleDescription

এই সমস্ত সুইচগুলি এড়ানোর জন্য যে কোনও উপায় খুঁজে পাবে তার জন্য অতিরিক্ত পয়েন্ট। এই কল্পিত অনুলিপিটির লাইন ধরে কিছুself = copy(self, self.desc + ", asdfasdf")
ডায়োগনভিউজ

4

এনামগুলিতে গেটর এবং সেটার ব্যতীত ভেরিয়েবলগুলি সংজ্ঞায়িত করা সম্ভব নয় এবং তাই আপনি পরিবর্তন করতে পারবেন এমন একটি ভেরিয়েবল থাকা অসম্ভব।

আপনি প্রোটোকলের সাথে সামঞ্জস্য করতে পারেন তবে ক্লাসগুলির মতো পরিবর্তনের সাথে আপনার একই আচরণ থাকতে পারে না।


2

এটি দ্রুতগতিতে এনাম সম্পর্কে একটি লিঙ্ক

কাঠামো এবং গণনা মান ধরণের। ডিফল্টরূপে, একটি মান ধরণের বৈশিষ্ট্যগুলি তার উদাহরণ পদ্ধতিগুলির মধ্যে থেকে পরিবর্তন করা যায় না। লিঙ্ক

তারপরে, আপনাকে মিউটেশন ফাংশনটি ব্যবহার করতে হবে।

enum ProtocolEnum: ExampleProtocol {
    case on, off
    var simpleDescription: String {
        switch self {
        case .on:
            return "Switch is ON"
        case .off:
            return "Switch is OFF"
        }
    }
    mutating func adjust() {
        switch self {
        case .on:
            self = off
        case .off:
            self = on
        }
    }
}

var c = ProtocolEnum.on
c.simpleDescription
c.adjust()
let cDescription = c.simpleDescription

1

অন্য বিকল্পগুলি হ'ল সামঞ্জস্য করা () কেসগুলির মধ্যে ফ্লিপ করার জন্য:

enum SimpleEnum: ExampleProtocol {
    case Foo, Bar

    var simpleDescription: String {
    get {
        let value = self == .Foo
            ? "Foo"
            : "Bar"
        return "A simple \(value) enum."
    }
    }

    mutating func adjust() {
        self = self == .Foo
            ? .Bar
            : .Foo
    }
}

1

জ্যাকের জবাবটি এখানে দেওয়া হচ্ছে:

protocol ICanWalk {
    var description: String { get }
    mutating func stepIt()
}

enum TwoStepsForwardThreeStepsBack: Int, ICanWalk {
    case Base = 0, Step1, Step2

    var description: String {
        return "Step \(self.rawValue)"
    }

    mutating func stepIt() {
        if let nextStep = TwoStepsForwardThreeStepsBack( rawValue: self.rawValue + 1 ) {
            // going forward.
            self = nextStep
        } else {
            // back to the base.
            self = TwoStepsForwardThreeStepsBack.Base
        }
    }
}

1

আমি এই নিয়ে এসেছি

protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}

enum Seat: ExampleProtocol {
    case WindowSeat, MiddleSeat, AisleSeat

    var simpleDescription : String {
        switch self {
        case .WindowSeat:
            return "Window Seat"
        case .MiddleSeat:
            return "Middle Seat"
        case .AisleSeat:
            return "Aisle Seat"
        }
    }

    mutating func adjust() {
        switch self {
        case .WindowSeat:
            self = .MiddleSeat
        case .MiddleSeat:
            self = . AisleSeat
        case .AisleSeat:
            self = .WindowSeat
        }
    }
}

var seat = Seat.MiddleSeat
print(seat.simpleDescription) // Middle Seat
seat.adjust()
print(seat.simpleDescription) // Aisle Seat

0

আমার কোড এখানে

enum SimpleEnum: ExampleProtocol {
    case Base, Adjusted
    var simpleDescription: String {
        get {
            var description = "A simple enum."
            switch self {
            case .Base:
                return description
            case .Adjusted:
                return description + " - [adjusted]"
            }
        }
    }
    mutating func adjust() {
        self = SimpleEnum.Adjusted
    }
}
var simpleEnum = SimpleEnum.Base
simpleEnum.adjust()
simpleEnum.simpleDescription

0

এখানে আমার প্রথম অবদান:

enum SimpleEnum: ExampleProtocol {
    case Basic(String), Adjusted(String)
    init() {
        self = SimpleEnum.Basic("A simple Enum")

    }

    var simpleDescription: String {
        get {
            switch self {
            case let .Basic(string):
                return string
            case let .Adjusted(string):
                return string
            }
        }
    }

    mutating func adjust() {
        self = SimpleEnum.Adjusted("full adjusted")

    }
}

var c = SimpleEnum()
c.adjust()
let cDescription = c.simpleDescription

অন্যদের জন্য ধন্যবাদ!


4
আপনি একটি ব্যাখ্যা যোগ করতে পারেন?
রবার্ট

@ রবার্ট এটিকে অন্যের মতো স্ব-স্বরূপ ব্যাখ্যা করা উচিত তবে বিভিন্নটি হ'ল আমি এনুমে আর ডি পদ্ধতি ব্যবহার করছি এবং ডিফল্ট বুনিয়াদি এনাম রয়েছে। সুতরাং আপনি দেখতে পাবেন যে আপনি যখন সুইফট খেলার মাঠে কাঠামোর মতো এনাম অবজেক্ট এবং শ্রেণীর উদাহরণ তৈরি করবেন।
ইন্দ্রা রুস্মিতা

0

পূর্ববর্তী সিম্পলক্লাস এবং সিম্পল স্ট্রাকচারের উদাহরণগুলির কারণে সম্পত্তিটি সরল বিবরণটি অভ্যন্তরীণভাবে সংশোধন করা হচ্ছে বলে এই পরীক্ষাটি আমাকেও ছুঁড়ে ফেলেছে, যার ফলে আমাকে ভাবতে হয়েছিল যে আমারও একই কাজ করা দরকার। এখানে পোস্ট করা অন্যান্য উত্তরগুলি দেখার পরে এবং অফিসিয়াল অ্যাপল সুইফ্ট ২.১ ডকুমেন্টেশন পড়ার পরে, আমি এটি নিয়ে এসেছি:

protocol ExampleProtocol {
     var simpleDescription: String { get }
     mutating func adjust()
}

enum SimpleEnum: ExampleProtocol {
    case Simple
    case Adjusted

    var simpleDescription: String {
        switch self {
        case .Simple:
            return "A simple enumeration"
        case .Adjusted:
            return "A simple enumeration somewhat changed."
        }
    }

    mutating func adjust() {
        self = .Adjusted
    }

    mutating func restore() {
        self = .Simple
    }
}

var d: SimpleEnum = .Simple
d.simpleDescription

d.adjust()
d.simpleDescription

d.restore()
d.simpleDescription

এছাড়াও লক্ষ্য করুন যে এই পরীক্ষার আগে অ্যাপল দ্বারা সিম্পলক্লাস এবং সিম্পল স্ট্রাকচারের দেওয়া উদাহরণগুলিতে সাধারণ বর্ণনাটি অভ্যন্তরীণভাবে হারিয়ে যায় - আপনি আসল মানটি ফিরে পেতে পারবেন না (অবশ্যই যদি আপনি এটি শ্রেণি / কাঠামোর বাইরে সংরক্ষণ না করেন); এটিই আমাকে সরলইনাম উদাহরণের জন্য একটি পুনরুদ্ধার () পদ্ধতি তৈরি করতে উত্সাহিত করেছিল, এটি আপনাকে মানগুলির মধ্যে পিছনে পিছনে টগল করতে দেয়। আশা করি এটি কারও কাজে লাগবে!


0

আমি ভাবছিলাম যে লক্ষ্যটি কেবল রাষ্ট্র বজায় রাখা এবং বর্তমান অবস্থাটি পড়ার পক্ষে সহজ করার জন্য একটি বিবরণ ব্যবহার করে:

enum SimpleEnum: ExampleProtocol {

    case Default, Adjusted

    init() {
        self = .Default
    }

    var simpleDescription: String { get { return "\(self) Value" }}

    mutating func adjust() {
        self = .Adjusted
    }
}

var simpleEnum = SimpleEnum()
simpleEnum.adjust()
let adjustedSimple = simpleEnum.simpleDescript

0

আরেকটি প্রকরণ: পূর্ববর্তী বিকল্পটি ধরে রাখতে ও প্রদর্শন করতে সংশ্লিষ্ট মানগুলি ব্যবহার করে ("নির্বাচিত 1 ফর্মটি 2 থেকে স্থায়ী, 1 থেকে সামঞ্জস্য, 2 থেকে সামঞ্জস্য, 1" থেকে সামঞ্জস্য)

protocol ExampleProtocol {
     var simpleDescription: String { get }
     mutating func adjust()
}

indirect enum EnumWithDescription: ExampleProtocol {
    case option1(EnumWithDescription?)
    case option2(EnumWithDescription?)
    var simpleDescription: String {
        return "Selected " + getDescription()
    }
    internal func getDescription() -> String {
        var currentValue: String
        let previousValue : EnumWithDescription?
        switch self {
        case .option1(let previous):
            currentValue = "1"
            previousValue = previous
        case .option2(let previous):
            currentValue = "2"
            previousValue = previous
        }
        if let adjustedFrom = previousValue?.getDescription() {
            return "\(currentValue) adjusted from \(adjustedFrom)"
        }
        else {
            return "\(currentValue)"
        }
    }
    mutating func adjust() {
        switch self {
        case .option1:
            self = .option2(self)
        case .option2:
            self = .option1(self)
        }
    }
}
var d = EnumWithDescription.option1(nil)
d.simpleDescription
d.adjust()
d.adjust()
d.simpleDescription
// Output: "Selected 1, adjusted from 2, adjusted from 1, adjusted from 2, adjusted from 1"

-1

এই সম্পর্কে

enum SimpleEnum : ExampleProtocol {
    case Desc(String)
    init() {
        self = Desc("a simple enum")
    }
    var simpleDescription:String {
        get {
            return (Mirror(reflecting: self).children.first!.value as? String)!
        }
    }
    mutating func adjust() {
        self = SimpleEnum.Desc(self.desc + " adjusted")
    }
}
var e = SimpleEnum()
e.simpleDescription    # => "a simple enum"
e.adjust()
e.simpleDescription    # => "a simple enum adjusted"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.