2017-08-23 37 views
13

tl साथ enum; डॉजेनेरिक स्विफ्ट 4 शून्य जुड़े प्रकार

यह प्रकार Void का एक संबद्ध मूल्य के साथ एक सामान्य स्विफ्ट 4 enum सदस्य का दृष्टांत करना संभव है?

पृष्ठभूमि

मैं एक साधारण परिणाम enum (antitypical Result के समान) का उपयोग कर रहा:

enum Result<T> { 
    case success(T) 
    case error(Error?) 
} 

अब मैं इस enum उपयोग करने के लिए एक ऑपरेशन का परिणाम प्रतिनिधित्व करना चाहते हैं जो वास्तविक परिणाम मूल्य उत्पन्न नहीं करता है; ऑपरेशन या तो या सफल विफल रहा है। इसके लिए मैं Result<Void> के रूप में टाइप को परिभाषित करता हूं, लेकिन मैं परिणाम उदाहरण बनाने के लिए संघर्ष कर रहा हूं, न तो let res: Result<Void> = .success और न ही let res: Result<Void> = .success() काम करता है।

+0

क्या आप दूसरे तरीके के बारे में निश्चित हैं? ऐसा लगता है कि यह काम करता है http://swift.sandbox.bluemix.net/#/repl/599d61b1b459cc41aee76d9d – pacification

+0

दिलचस्प, उदाहरण के लिए धन्यवाद। मैंने फिर से जांच की, लेकिन एक्सकोड 9 बीटा 5 के अंदर मुझे 'कॉलम में पैरामीटर # 1 के लिए गुम तर्क' मिलता है। –

+0

@ हैमिश: आप शायद सही हैं (मैं अभी भी एसई -0110 और एसई -0029 पर था ... :) –

उत्तर

28

स्विफ्ट 3 में आप प्रकार Void के जुड़े मूल्य छोड़ सकते हैं:

let res: Result<Void> = .success() 

स्विफ्ट 4 में आप प्रकार Void का एक संबद्ध मूल्य पारित करने के लिए है:

let res: Result<Void> = .success(()) 
// Or just: 
let res = Result.success(()) 
+5

क्या कोई कम बदसूरत समाधान है? –

+0

@RodrigoRuiz आप '(()) 'से छुटकारा पाने के लिए एक एक्सटेंशन को परिभाषित कर सकते हैं, [मेरा जवाब देखें] (https://stackoverflow.com/a/46863180/2976878)। – Hamish

3

शून्य के लिए सरल typealias है खाली टपल:() ताकि आप निम्न में से किसी रूप में इसका इस्तेमाल कर सकते हैं:

let res1: Result<Void> = .success(()) 
let res2 = Result<Void>.success(()) 
let res3 = Result.success(() as Void) 
let res4 = Result.success(()) 
10

स्विफ्ट 4 में, Void संबंधित मान वाला एक एनम केस अब संबंधित मानों की खाली सूची के साथ एक एनम केस के बराबर नहीं है।

मेरा मानना ​​है कि यह, है as Martin says, जहां अब एक समारोह के लिए तर्कों की किसी टपल गुजरती हैं और उन्हें मानकों के पार "सूचक" (हालांकि प्रस्ताव चिह्नित किया गया था स्विफ्ट 3 में लागू किया, मेरा मानना ​​है कि कर सकते हैं SE-0029 का एक परिणाम स्विफ्ट 4 के लिए SE-0110 के कार्यान्वयन में बाद में यह विशेष मामला उठाया गया था)।

नतीजतन, इसका मतलब है आप उसकी कोई भी () -> T स्विफ्ट 4 में अब आप स्पष्ट रूप में Void पारित करने के लिए है के रूप में एक (Void) -> T कॉल कर सकते हैं:

let result = Result.success(()) 

हालांकि, मैं यह बहुत बदसूरत लगता है, इसलिए मैं आम तौर पर इस तरह एक विस्तार को लागू:

आप कहते हैं की सुविधा देता है जो इस तरह बातें:

var result = Result.success 
result = .success 

यह ध्यान देने योग्य है कि यह कार्यवाही केवल enum मामलों तक ही सीमित नहीं है, इसका उपयोग सामान्य रूप से विधियों के साथ भी किया जा सकता है। उदाहरण के लिए:

struct Foo<T> { 
    func bar(_ a: T) {} 
} 

extension Foo where T == Void { 
    func bar() { bar(()) } 
} 

let f = Foo<Void>() 

// without extension: 
f.bar(()) 

// with extension: 
f.bar() 
+0

((नाइस))। यह नहीं पता था कि आप जेनरिक के प्रकार के आधार पर युद्ध परिभाषित कर सकते हैं। – GoldenJoe

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