2014-06-10 17 views
37

Tôi đã biểu thức này trả về một UInt32:Swift convert UINT để int

let randomLetterNumber = arc4random()%26 

Tôi muốn để có thể sử dụng số trong này nếu tuyên bố:

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

Vấn đề này là giao diện điều khiển đang cho tôi điều này

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

Vấn đề là UInt32 không thể được so sánh với số Int. Tôi muốn truyền randomLetterNumber đến Int. Tôi đã thử:

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

Những cả gây could not find an overload for '%' that accepts the supplied arguments.

Làm thế nào tôi có thể đúc các giá trị hoặc sử dụng nó trong câu lệnh if?

Trả lời

69

Int(arc4random_uniform(26)) thực hiện hai điều, một nó giúp loại bỏ những kết quả tiêu cực từ phương pháp và thứ hai hiện tại của bạn nên tạo một cách chính xác một Int từ kết quả.

+2

Cảm ơn điều đó, trình khởi tạo Int() dường như thực hiện thủ thuật. – 68cherries

+3

Bạn có thể đọc thêm về chuyển đổi loại số trong ** [Tài liệu Swift của Apple] (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/TheBasics.html#//apple_ref/ doc/uid/TP40014097-CH5-XID_420) **. –

+7

Cảm ơn. Tôi đã có một vấn đề tương tự với arc4random_uniform (someArray.count) đúc sửa lỗi arc4random_uniform (UInt32 (someArray.count)) – nacross

10

Chỉ cần tạo một int mới với nó

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

hoặc nếu bạn không bao giờ quan tâm đến UInt32 bạn chỉ có thể tạo ra một Int ngay lập tức:

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

Lưu ý rằng điều này sẽ ném một ngoại lệ một nửa thời gian do tràn kiểm tra, sử dụng câu trả lời tôi đã đưa ra để tránh điều đó. –

+0

@David, như thế nào? Không đồng ý, chỉ muốn hiểu ý bạn là gì. – Firo

+1

Trên thực tế nó sẽ không kể từ khi bạn đang làm đúc sau khi modulo, vì vậy bạn có thể đảm bảo nó luôn luôn trong giới hạn. 'Int (arc4random())' sẽ giảm 50% thời gian nó được thực thi trên nền tảng 32-bit vì một UInt32 sẽ không khớp với Int32. Chỉ cần nhìn thấy quá nhiều "arc4random bị lỗi và treo" câu hỏi nhanh chóng. Trong mọi trường hợp, arc4random_uniform sẽ phân phối đồng đều hơn. –

8

More đơn giản hơn thế này, không thể:

Int(myUInteger) 
+0

Điều này hoàn toàn trái ngược với những gì OP hỏi. Nên là 'Int (myUInteger)' – alternatiph

0

Bạn có thể làm

let u: UInt32 = 0x1234abcd 
let s: Int32 = Int32(bitPattern: u) 
Các vấn đề liên quan