2014-06-10 9 views
37

मैं है इस अभिव्यक्ति जो रिटर्न एक UInt32:स्विफ्ट परिवर्तित uint Int को

let randomLetterNumber = arc4random()%26 

मैं बयान करता है, तो इस में नंबर का उपयोग करने में सक्षम होना चाहते:

if letters.count > randomLetterNumber{ 
    var randomLetter = letters[randomLetterNumber] 
} 

यह समस्या है कि है सांत्वना मुझे इस

Playground execution failed: error: <REPL>:11:18: error: could not find an overload for '>' that accepts the supplied arguments 
if letters.count > randomLetterNumber{ 
    ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ 

समस्या दे रहा है कि UInt32 नहीं कर सकता है Int से तुलना की जा सकती है। मैं randomLetterNumber को Int पर डालना चाहता हूं। मैंने कोशिश की है:

let randomLetterUNumber : Int = arc4random()%26 
let randomLetterUNumber = arc4random()%26 as Int 

ये दोनों कारण could not find an overload for '%' that accepts the supplied arguments.

मैं मूल्य डाल सकता कैसे या यदि बयान में इसका इस्तेमाल करते हैं?

उत्तर

69

Int(arc4random_uniform(26)) दो चीजें करता है, यह आपके वर्तमान विधि से नकारात्मक परिणामों को समाप्त करता है और दूसरा परिणाम से एक इंट सही ढंग से बनाना चाहिए।

+2

इसके लिए धन्यवाद, Int() प्रारंभकर्ता चाल चल रहा है। – 68cherries

+3

आप ** [ऐप्पल के स्विफ्ट डॉक्स] में संख्यात्मक प्रकार के रूपांतरण के बारे में अधिक पढ़ सकते हैं (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/TheBasics.html#//apple_ref/ डॉक/यूआईडी/TP40014097-CH5-XID_420) **। –

+7

धन्यवाद। मुझे arc4random_uniform (someArray.count) के साथ एक ही समस्या थी कास्टिंग समस्या arc4random_uniform (UInt32 (someArray.count) को हल करता है) – nacross

10

बस इसे

let newRandom: Int = Int(randomLetterNumber) 
if letters.count > newRandom { 
    var randomLetter = letters[newRandom] 
} 

के साथ एक नया पूर्णांक बना सकते हैं या यदि आप कभी नहीं UInt32 के बारे में परवाह तुम सिर्फ एक इंट तुरंत बना सकते हैं:

let randomLetterNumber = Int(arc4random() % 26) 
+0

ध्यान दें कि इससे ओवरफ़्लो के कारण आधा समय अपवाद फेंक देगा जांच, उस उत्तर का उपयोग करें जो मैंने उससे बचने के लिए दिया था। –

+0

@ डेविड, कैसे? असहमत नहीं, बस समझना चाहते हैं कि आपका क्या मतलब है। – Firo

+1

दरअसल यह तब से नहीं होगा जब आप मॉड्यूलो के बाद कास्टिंग कर रहे हों, ताकि आप इसकी सीमाओं में हमेशा गारंटी दे सकें। 'Int (arc4random())' 32-बिट प्लेटफॉर्म पर निष्पादित होने के 50% समय को क्रैश करेगा क्योंकि UI3232 इंट 32 में फिट नहीं होगा। तेजी से बहुत से "arc4random बग और क्रैश" सवाल देखा है। किसी भी मामले में arc4random_uniform एक और समान वितरण प्रदान करेगा। –

8

अधिक इस से सरल, असंभव:

Int(myUInteger) 
+0

यह ओपी से पूछे जाने वाले सटीक विपरीत है। 'Int (myUInteger) होना चाहिए – alternatiph

0

आप

कर सकते हैं
let u: UInt32 = 0x1234abcd 
let s: Int32 = Int32(bitPattern: u) 
संबंधित मुद्दे