2015-05-24 5 views
13

जैसा कि मैंने कोड का पालन करने की कोशिश की, मुझे कुछ त्रुटियां मिलती हैं।क्या रॉव वैल्यूज़ क्लोजर के साथ स्विफ्ट में एनम बनाना संभव है?

enum Operate: ((Double, Double) -> Double) = { 
    case Plus = {$1 + $0} 
    case Minus = {$1 - $0} 
    case Multiply = {$1 * $0} 
    case Divide = {$1/$0} 
} 

क्या रॉव वैल्यूज़ क्लोजर के साथ स्विफ्ट में एनम बनाना संभव है? धन्यवाद।

+3

[कच्चे मूल्यों तार, वर्ण, या कोई भी हो सकता पूर्णांक या फ़्लोटिंग-पॉइंट संख्या प्रकार।] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-ID149) मुझे लगता है कि जवाब नहीं है। – Pang

+0

यदि भविष्य है, तो कृपया वास्तव में प्रश्न में अपनी त्रुटियों को शामिल करना सुनिश्चित करें। यह यहां पूरी तरह से अप्रासंगिक हो सकता है, लेकिन यह देखते हुए कि आप यहां एक प्रश्न पूछने के लिए हैं, जितना संभव हो उतना विस्तार प्रदान करना सबसे अच्छा है। इसके अतिरिक्त, यह खोज परिणामों में सुधार करता है और डुप्लीकेट प्रश्नों की पहचान करने में मदद कर सकता है। – nhgrif

उत्तर

7

जैसा कि @ पांग ने कहा, केवल स्ट्रिंग्स, वर्ण या फ़्लोटिंग-पॉइंट नंबर प्रकारों के किसी भी पूर्णांक को कच्चे प्रकार के रूप में उपयोग किया जा सकता है।

struct Operate { 
    typealias OperationType = (Double, Double) -> Double 

    static let Plus : OperationType = { $0 + $1 } 
    static let Minus: OperationType = { $0 - $1 } 
    // ... 
} 

let plus = Operate.Plus 
plus(1.0, 2.0) // 3.0 
+0

यह स्पष्ट रूप से संकलित करता है, लेकिन मुझे यकीन नहीं है कि ओपी क्या चाहता है, जो संभावित रूप से एक 'enum' चर है जो 'init' समय पर चयनित सही बंद रखता है (और लौटाता है) - वह जो कुछ और डाल सकता है जटिल संरचना जैसे 'संरचना कैलकुलेटर बटन {var बटन: UIButton; var संचालित: ऑपरेट करें} ' शायद ओपी स्पष्ट कर सकता है कि वह क्या प्रयास कर रहा था? – Grimxn

+0

मैं मानता हूं, ओपी स्पष्ट हो सकता है तो यह अच्छा होगा। अगर वे एक ऑपरेशन स्टोर करने का इरादा रखते हैं; एक विकल्प 'ऑपरेशन टाइप' को बंद करना होगा और संचालन के लिए 'ऑपरेटेट' कक्षा का उपयोग करना होगा। हालांकि, यदि ओपी को संचालन की तुलना करने की आवश्यकता है तो यह एक उचित समाधान नहीं होगा। – ABakerSmith

5

एक अन्य संभावित रास्ता है, लेकिन enum का उपयोग कर: हालांकि, अगर आप एक struct का उपयोग कर कुछ इसी तरह प्राप्त कर सकते थे

typealias TwoOp = (Double, Double) -> Double 

enum Operate { 

    case Plus, Minus // etc... 

    var op: TwoOp { 
     get { 
      switch self { 
      case .Plus: 
       return {$1 + $0} 
      case .Minus: 
       return {$1 - $0} 
      } 
     } 
    } 
} 

let opPlus = Operate.Plus 
let answerP = opPlus.op(3, 2) 
let opMinus = Operate.Minus 
let answerM = opMinus.op(3, 2) 
1

कच्चे मूल्य एक बंद नहीं किया जा सकता है, लेकिन वहाँ enums के लिए एक और विकल्प है ।

एन्म्स किसी संबंधित प्रकार का समर्थन करता है जो आपके इच्छित प्रकार को पकड़ सकता है। आप अपने बंद स्टोर को स्टोर करने के लिए एक संबंधित मूल्य का उपयोग कर सकते हैं। Enum संबंधित मूल्यों के बारे में अधिक जानकारी के लिए स्विफ्ट भाषा iBook पर एक नज़र डालें।

1

@Duncan सी के रूप में के बजाय कच्चे प्रकार के साथ एक enum बनाने की ने कहा, इस प्रकार है जहां प्रत्येक मामले में एक संबद्ध महत्व है कि आप एक enum बना सकते हैं:

private enum Operation { 
      case BinaryOperation((Double, Double) -> Double) 
      case UrinaryOperation((Double) -> Double) 
     } 

जुड़े मूल्य के प्रकार कोष्ठक में चला जाता है प्रत्येक मामले के बगल में। कच्चे मूल्यों के विपरीत, संबंधित मूल्य बंद हो सकते हैं।

फिर आप प्रकार (Double, Double) -> Double का एक संबद्ध मूल्य के साथ प्रकार ऑपरेशन के एक चर बना सकते हैं:

let plus = Operation.BinaryOperation({$0 + $1}) 
let minus = Operation.BinaryOperation({$0 - $1}) 
let multiply = Operation.BinaryOperation({$0 * $1}) 
let divide = Operation.BinaryOperation({$0/$1}) 
let plus = Operation.BinaryOperation({$0 + $1}) 

let abs = Operation.UrinaryOperation({abs($0)}) 

और उन्हें इस्तेमाल:

plus(3.0,2.0) //5.0 
abs(-4.0)  //4.0 
+0

इस प्रकार का तर्क कैलकुलेटर ऐप बनाने के लिए बहुत उपयोगी है! –

संबंधित मुद्दे