2014-08-30 21 views
39

Im tạo ứng dụng khách Tcp và do đó sử dụng CFStreamCreatePairWithSocketToHost đang mong đợi một UInt32 cho tham số thứ hai.Chuyển đổi Int thành UInt32 trong Swift

Dưới đây là một mẫu của những gì tôi đang cố gắng để làm .:

func initNetwork(IP: String, Port: Int) { 
    // relevant stuff 

    //Convert Port:Int to UInt32 to make this shit work! 

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, IP as NSString , Port , &readStream, &writeStream) 

    // Irelevant stuff 
} 

Tôi đã được nhìn xung quanh cho một giải pháp cho một số thời gian bây giờ, và tôi dường như không thể tìm thấy một!

Trả lời

79

Bạn có thể làm điều đó một cách dễ dàng:

var x = UInt32(yourInt) 
+12

Nó không đúc. UInt cung cấp một bộ khởi tạo chấp nhận Int. – akashivskyy

5

Nó rất đơn giản:

let int: Int = 40 
let uint = UInt32(i) 

trong trường hợp của bạn, chỉ cần vượt qua

UInt32(Port) 

Đối với một cổng được không phải là một vấn đề, nhưng trong những trường hợp khác hãy chắc chắn để chăm sóc tràn

Lưu ý bên: trong thực tế, hãy nhanh chóng đặt tên biến bằng cách sử dụng trường hợp lạc đà thấp hơn, do đó, với chữ cái đầu tiên trong chữ thường

11

Nikos M.'s answer sức tràn vì Swift Int s là 64 bit bây giờ, và Swift sẽ sụp đổ khi mặc định UInt32 initializer tràn. Nếu bạn muốn tránh tràn, hãy sử dụng the truncatingBitPattern initializer.

Nếu bạn chắc chắn dữ liệu của mình sẽ không tràn, thì bạn nên sử dụng trình khởi tạo mặc định vì phần thừa biểu thị dữ liệu không hợp lệ cho ứng dụng của bạn. Nếu bạn chắc chắn dữ liệu của mình sẽ tràn, nhưng bạn không quan tâm đến việc cắt ngắn (như nếu bạn đang xây dựng giá trị băm hoặc thứ gì đó) thì bạn có thể muốn cắt bớt.

let myInt: Int = 576460752303423504 
let myUInt32 = UInt32(truncatingBitPattern: myInt) 
+2

Tôi không đồng ý. Điều này âm thầm thay đổi dữ liệu. Kích hoạt một sự hoảng sợ rõ ràng do cổng ngoài phạm vi tốt hơn là giả vờ một giá trị khác được chuyển. Swift mặc định là hoảng sợ-on-overflow vì một lý do. –

+1

Đủ công bằng. Tôi sẽ cập nhật câu trả lời. –

+3

Cách tốt nhất để kiểm tra là gì, nếu giá trị đầu vào sẽ kích hoạt tràn? 'if myInt> Int (UInt32.max) {...}'? 'if myInt == Int (UInt32 (truncatingBitPattern: myInt)) {...}'? – Klaas

5

Vẫn còn nhiều dễ dàng hơn: (Tự hỏi tại sao họ sử dụng Func unsigned)

var x = Int32(yourInt) 
Các vấn đề liên quan