Swift在UInt和Int之间转换
我有以下方法
var photos = [MWPhoto] = [MWPhoto]() func numberOfPhotosInPhotoBrowser(photoBrowser: MWPhotoBrowser!) -> UInt { return self.photos.count } func photoBrowser(photoBrowser: MWPhotoBrowser!, photoAtIndex index: UInt) -> MWPhotoProtocol! { return self.photos[index] }
然而,第一我得到Int is not convertible to UInt
(因为self.photos.count
是一个Int
而对于第二个UInt is not convertible to Int
– 因为self.photos[
只能采取一个INT为其索引。
如何正确地将UInt转换为Int并返回?
在第一个中,返回types是UInt ,但是由于count返回Int,所以返回Int。
基本上,UInt有一个初始值设定项,它可以使用Int,CGFloat,Double或事件string等值types参数的variables,并返回一个新的值types。
- UInt(8) //结果是8 UInt值types
- UInt(20.12) //结果是20个UInt值types
- UInt(Double(10)) //结果是10个UInt值types
- UInt(“10”) //结果是10 UInt值types,注意这是failable初始值设定项,可以是一个值或零
–
func numberOfPhotosInPhotoBrowser(photoBrowser: MWPhotoBrowser!) -> UInt { return UInt(self.photos.count) }
对于第二个,数组下标需要在传递UInt的地方使用Int值,所以从UInt创build一个新的Int值types,
func photoBrowser(photoBrowser: MWPhotoBrowser!, photoAtIndex index: UInt) -> MWPhotoProtocol! { return self.photos[Int(index)] }
// initializing Int var someInt: Int = 8 someInt // Converting Int to UInt var someIntToUInt: UInt = UInt(someInt) someIntToUInt // initializing UInt var someUInt: UInt = 10 someUInt // Converting UInt to Int var someUIntToInt: Int = Int(someUInt) someUIntToInt
如果你想从负值的unsigned int使用UInt(bitPattern 🙂
let intVal = -1 let uintVal = UInt(bitPattern: intVal) // uintVal == 0xffffffffffffffff
在课堂以外的任何地方添加:
extension UInt { /// SwiftExtensionKit var toInt: Int { return Int(self) } }
然后,只需拨打:
self.photos[index].toInt
我对Swift的神秘的方法参数bitPattern:和truncatingBitPattern:感到非常沮丧,而且我无法记住哪一个使用时,我创build了包含大量转换方法的以下类。
我不一定build议你在你的程序中包含这个。 我相信很多人会说斯威夫特试图保护我们免受自己的破坏,这种努力是愚蠢的。 所以,也许你应该把这个文件作为一种备忘单保存在某个地方,这样你就可以快速确定如何进行转换,并在需要时将这些参数复制到你的程序中。
顺便说一句, JDI代表“只是做”。
/// Class containing a large number of static methods to convert an Int to a UInt or vice-versa, and /// also to perform conversions between different bit sizes, for example UInt32 to UInt8. /// /// Many of these "conversions" are trivial, and are only included for the sake of completeness. /// /// A few of the conversions involving Int and UInt can give different results when run on 32-bit /// and 64-bit systems. All of the conversion where the bit size of both the source and the target /// are specified will always give the same result independent of platform. public class JDI { // MARK: - To signed Int // To Int8 public static func ToInt8(_ x : Int8) -> Int8 { return x } public static func ToInt8(_ x : Int32) -> Int8 { return Int8(truncatingBitPattern: x) } public static func ToInt8(_ x : Int64) -> Int8 { return Int8(truncatingBitPattern: x) } public static func ToInt8(_ x : Int) -> Int8 { return Int8(truncatingBitPattern: x) } public static func ToInt8(_ x : UInt8) -> Int8 { return Int8(bitPattern: x) } public static func ToInt8(_ x : UInt32) -> Int8 { return Int8(truncatingBitPattern: x) } public static func ToInt8(_ x : UInt64) -> Int8 { return Int8(truncatingBitPattern: x) } public static func ToInt8(_ x : UInt) -> Int8 { return Int8(truncatingBitPattern: x) } // To Int32 public static func ToInt32(_ x : Int8) -> Int32 { return Int32(x) } public static func ToInt32(_ x : Int32) -> Int32 { return x } public static func ToInt32(_ x : Int64) -> Int32 { return Int32(truncatingBitPattern: x) } public static func ToInt32(_ x : Int) -> Int32 { return Int32(truncatingBitPattern: x) } public static func ToInt32(_ x : UInt8) -> Int32 { return Int32(x) } public static func ToInt32(_ x : UInt32) -> Int32 { return Int32(bitPattern: x) } public static func ToInt32(_ x : UInt64) -> Int32 { return Int32(truncatingBitPattern: x) } public static func ToInt32(_ x : UInt) -> Int32 { return Int32(truncatingBitPattern: x) } // To Int64 public static func ToInt64(_ x : Int8) -> Int64 { return Int64(x) } public static func ToInt64(_ x : Int32) -> Int64 { return Int64(x) } public static func ToInt64(_ x : Int64) -> Int64 { return x } public static func ToInt64(_ x : Int) -> Int64 { return Int64(x) } public static func ToInt64(_ x : UInt8) -> Int64 { return Int64(x) } public static func ToInt64(_ x : UInt32) -> Int64 { return Int64(x) } public static func ToInt64(_ x : UInt64) -> Int64 { return Int64(bitPattern: x) } public static func ToInt64(_ x : UInt) -> Int64 { return Int64(bitPattern: UInt64(x)) // Does not extend high bit of 32-bit input } // To Int public static func ToInt(_ x : Int8) -> Int { return Int(x) } public static func ToInt(_ x : Int32) -> Int { return Int(x) } public static func ToInt(_ x : Int64) -> Int { return Int(truncatingBitPattern: x) } public static func ToInt(_ x : Int) -> Int { return x } public static func ToInt(_ x : UInt8) -> Int { return Int(x) } public static func ToInt(_ x : UInt32) -> Int { if MemoryLayout<Int>.size == MemoryLayout<Int32>.size { return Int(Int32(bitPattern: x)) // For 32-bit systems, non-authorized interpretation } return Int(x) } public static func ToInt(_ x : UInt64) -> Int { return Int(truncatingBitPattern: x) } public static func ToInt(_ x : UInt) -> Int { return Int(bitPattern: x) } // MARK: - To unsigned Int // To UInt8 public static func ToUInt8(_ x : Int8) -> UInt8 { return UInt8(bitPattern: x) } public static func ToUInt8(_ x : Int32) -> UInt8 { return UInt8(truncatingBitPattern: x) } public static func ToUInt8(_ x : Int64) -> UInt8 { return UInt8(truncatingBitPattern: x) } public static func ToUInt8(_ x : Int) -> UInt8 { return UInt8(truncatingBitPattern: x) } public static func ToUInt8(_ x : UInt8) -> UInt8 { return x } public static func ToUInt8(_ x : UInt32) -> UInt8 { return UInt8(truncatingBitPattern: x) } public static func ToUInt8(_ x : UInt64) -> UInt8 { return UInt8(truncatingBitPattern: x) } public static func ToUInt8(_ x : UInt) -> UInt8 { return UInt8(truncatingBitPattern: x) } // To UInt32 public static func ToUInt32(_ x : Int8) -> UInt32 { return UInt32(bitPattern: Int32(x)) // Extend sign bit, assume minus input significant } public static func ToUInt32(_ x : Int32) -> UInt32 { return UInt32(bitPattern: x) } public static func ToUInt32(_ x : Int64) -> UInt32 { return UInt32(truncatingBitPattern: x) } public static func ToUInt32(_ x : Int) -> UInt32 { return UInt32(truncatingBitPattern: x) } public static func ToUInt32(_ x : UInt8) -> UInt32 { return UInt32(x) } public static func ToUInt32(_ x : UInt32) -> UInt32 { return x } public static func ToUInt32(_ x : UInt64) -> UInt32 { return UInt32(truncatingBitPattern: x) } public static func ToUInt32(_ x : UInt) -> UInt32 { return UInt32(truncatingBitPattern: x) } // To UInt64 public static func ToUInt64(_ x : Int8) -> UInt64 { return UInt64(bitPattern: Int64(x)) // Extend sign bit, assume minus input significant } public static func ToUInt64(_ x : Int32) -> UInt64 { return UInt64(bitPattern: Int64(x)) // Extend sign bit, assume minus input significant } public static func ToUInt64(_ x : Int64) -> UInt64 { return UInt64(bitPattern: x) } public static func ToUInt64(_ x : Int) -> UInt64 { return UInt64(bitPattern: Int64(x)) // Extend sign bit if necessary, assume minus input significant } public static func ToUInt64(_ x : UInt8) -> UInt64 { return UInt64(x) } public static func ToUInt64(_ x : UInt32) -> UInt64 { return UInt64(x) } public static func ToUInt64(_ x : UInt64) -> UInt64 { return x } public static func ToUInt64(_ x : UInt) -> UInt64 { return UInt64(x) // Does not extend high bit of 32-bit input } // To UInt public static func ToUInt(_ x : Int8) -> UInt { return UInt(bitPattern: Int(x)) // Extend sign bit, assume minus input significant } public static func ToUInt(_ x : Int32) -> UInt { return UInt(truncatingBitPattern: Int64(x)) // Extend sign bit, assume minus input significant } public static func ToUInt(_ x : Int64) -> UInt { return UInt(truncatingBitPattern: x) } public static func ToUInt(_ x : Int) -> UInt { return UInt(bitPattern: x) } public static func ToUInt(_ x : UInt8) -> UInt { return UInt(x) } public static func ToUInt(_ x : UInt32) -> UInt { return UInt(x) } public static func ToUInt(_ x : UInt64) -> UInt { return UInt(truncatingBitPattern: x) } public static func ToUInt(_ x : UInt) -> UInt { return x } }
以下是一些testing代码:
public func doTest() { // To Int8 assert(JDI.ToInt8(42 as Int8) == 42) assert(JDI.ToInt8(-13 as Int8) == -13) assert(JDI.ToInt8(42 as Int32) == 42) assert(JDI.ToInt8(257 as Int32) == 1) assert(JDI.ToInt8(42 as Int64) == 42) assert(JDI.ToInt8(257 as Int64) == 1) assert(JDI.ToInt8(42 as Int) == 42) assert(JDI.ToInt8(257 as Int) == 1) assert(JDI.ToInt8(42 as UInt8) == 42) assert(JDI.ToInt8(0xf3 as UInt8) == -13) assert(JDI.ToInt8(42 as UInt32) == 42) assert(JDI.ToInt8(0xfffffff3 as UInt32) == -13) assert(JDI.ToInt8(42 as UInt64) == 42) assert(JDI.ToInt8(UInt64.max - 12) == -13) assert(JDI.ToInt8(42 as UInt) == 42) assert(JDI.ToInt8(UInt.max - 12) == -13) // To Int32 assert(JDI.ToInt32(42 as Int8) == 42) assert(JDI.ToInt32(-13 as Int8) == -13) assert(JDI.ToInt32(42 as Int32) == 42) assert(JDI.ToInt32(-13 as Int32) == -13) assert(JDI.ToInt32(42 as Int64) == 42) assert(JDI.ToInt32(Int64(Int32.min) - 1) == Int32.max) assert(JDI.ToInt32(42 as Int) == 42) assert(JDI.ToInt32(-13 as Int) == -13) assert(JDI.ToInt32(42 as UInt8) == 42) assert(JDI.ToInt32(0xf3 as UInt8) == 243) assert(JDI.ToInt32(42 as UInt32) == 42) assert(JDI.ToInt32(0xfffffff3 as UInt32) == -13) assert(JDI.ToInt32(42 as UInt64) == 42) assert(JDI.ToInt32(UInt64.max - 12) == -13) assert(JDI.ToInt32(42 as UInt) == 42) assert(JDI.ToInt32(UInt.max - 12) == -13) // To Int64 assert(JDI.ToInt64(42 as Int8) == 42) assert(JDI.ToInt64(-13 as Int8) == -13) assert(JDI.ToInt64(42 as Int32) == 42) assert(JDI.ToInt64(-13 as Int32) == -13) assert(JDI.ToInt64(42 as Int64) == 42) assert(JDI.ToInt64(-13 as Int64) == -13) assert(JDI.ToInt64(42 as Int) == 42) assert(JDI.ToInt64(-13 as Int) == -13) assert(JDI.ToInt64(42 as UInt8) == 42) assert(JDI.ToInt64(0xf3 as UInt8) == 243) assert(JDI.ToInt64(42 as UInt32) == 42) assert(JDI.ToInt64(0xfffffff3 as UInt32) == 4294967283) assert(JDI.ToInt64(42 as UInt64) == 42) assert(JDI.ToInt64(UInt64.max - 12) == -13) assert(JDI.ToInt64(42 as UInt) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToInt64(UInt.max - 12) == 4294967283) // For 32-bit systems #else assert(JDI.ToInt64(UInt.max - 12) == -13) // For 64-bit systems #endif // To Int assert(JDI.ToInt(42 as Int8) == 42) assert(JDI.ToInt(-13 as Int8) == -13) assert(JDI.ToInt(42 as Int32) == 42) assert(JDI.ToInt(-13 as Int32) == -13) assert(JDI.ToInt(42 as Int64) == 42) assert(JDI.ToInt(-13 as Int64) == -13) assert(JDI.ToInt(42 as Int) == 42) assert(JDI.ToInt(-13 as Int) == -13) assert(JDI.ToInt(42 as UInt8) == 42) assert(JDI.ToInt(0xf3 as UInt8) == 243) assert(JDI.ToInt(42 as UInt32) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToInt(0xfffffff3 as UInt32) == -13) // For 32-bit systems #else assert(JDI.ToInt(0xfffffff3 as UInt32) == 4294967283) // For 64-bit systems #endif assert(JDI.ToInt(42 as UInt64) == 42) assert(JDI.ToInt(UInt64.max - 12) == -13) assert(JDI.ToInt(42 as UInt) == 42) assert(JDI.ToInt(UInt.max - 12) == -13) // To UInt8 assert(JDI.ToUInt8(42 as Int8) == 42) assert(JDI.ToUInt8(-13 as Int8) == 0xf3) assert(JDI.ToUInt8(42 as Int32) == 42) assert(JDI.ToUInt8(-13 as Int32) == 0xf3) assert(JDI.ToUInt8(42 as Int64) == 42) assert(JDI.ToUInt8(-13 as Int64) == 0xf3) assert(JDI.ToUInt8(Int64.max - 12) == 0xf3) assert(JDI.ToUInt8(42 as Int) == 42) assert(JDI.ToUInt8(-13 as Int) == 0xf3) assert(JDI.ToUInt8(Int.max - 12) == 0xf3) assert(JDI.ToUInt8(42 as UInt8) == 42) assert(JDI.ToUInt8(0xf3 as UInt8) == 0xf3) assert(JDI.ToUInt8(42 as UInt32) == 42) assert(JDI.ToUInt8(0xfffffff3 as UInt32) == 0xf3) assert(JDI.ToUInt8(42 as UInt64) == 42) assert(JDI.ToUInt8(UInt64.max - 12) == 0xf3) assert(JDI.ToUInt8(42 as UInt) == 42) assert(JDI.ToUInt8(UInt.max - 12) == 0xf3) // To UInt32 assert(JDI.ToUInt32(42 as Int8) == 42) assert(JDI.ToUInt32(-13 as Int8) == 0xfffffff3) assert(JDI.ToUInt32(42 as Int32) == 42) assert(JDI.ToUInt32(-13 as Int32) == 0xfffffff3) assert(JDI.ToUInt32(42 as Int64) == 42) assert(JDI.ToUInt32(-13 as Int64) == 0xfffffff3) assert(JDI.ToUInt32(Int64.max - 12) == 0xfffffff3) assert(JDI.ToUInt32(42 as Int) == 42) assert(JDI.ToUInt32(-13 as Int) == 0xfffffff3) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt32(Int.max - 12) == 0x7ffffff3) // For 32-bit systems #else assert(JDI.ToUInt32(Int.max - 12) == 0xfffffff3) // For 64-bit systems #endif assert(JDI.ToUInt32(42 as UInt8) == 42) assert(JDI.ToUInt32(0xf3 as UInt8) == 0xf3) assert(JDI.ToUInt32(42 as UInt32) == 42) assert(JDI.ToUInt32(0xfffffff3 as UInt32) == 0xfffffff3) assert(JDI.ToUInt32(42 as UInt64) == 42) assert(JDI.ToUInt32(UInt64.max - 12) == 0xfffffff3) assert(JDI.ToUInt32(42 as UInt) == 42) assert(JDI.ToUInt32(UInt.max - 12) == 0xfffffff3) // To UInt64 assert(JDI.ToUInt64(42 as Int8) == 42) assert(JDI.ToUInt64(-13 as Int8) == 0xfffffffffffffff3) assert(JDI.ToUInt64(42 as Int32) == 42) assert(JDI.ToUInt64(-13 as Int32) == 0xfffffffffffffff3) assert(JDI.ToUInt64(42 as Int64) == 42) assert(JDI.ToUInt64(-13 as Int64) == 0xfffffffffffffff3) assert(JDI.ToUInt64(Int64.max - 12) == (UInt64.max >> 1) - 12) assert(JDI.ToUInt64(42 as Int) == 42) assert(JDI.ToUInt64(-13 as Int) == 0xfffffffffffffff3) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt64(Int.max - 12) == 0x7ffffff3) // For 32-bit systems #else assert(JDI.ToUInt64(Int.max - 12) == 0x7ffffffffffffff3) // For 64-bit systems #endif assert(JDI.ToUInt64(42 as UInt8) == 42) assert(JDI.ToUInt64(0xf3 as UInt8) == 0xf3) assert(JDI.ToUInt64(42 as UInt32) == 42) assert(JDI.ToUInt64(0xfffffff3 as UInt32) == 0xfffffff3) assert(JDI.ToUInt64(42 as UInt64) == 42) assert(JDI.ToUInt64(UInt64.max - 12) == 0xfffffffffffffff3) assert(JDI.ToUInt64(42 as UInt) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt64(UInt.max - 12) == 0xfffffff3) // For 32-bit systems #else assert(JDI.ToUInt64(UInt.max - 12) == 0xfffffffffffffff3) // For 64-bit systems #endif // To UInt assert(JDI.ToUInt(42 as Int8) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt(-13 as Int8) == 0xfffffff3) // For 32-bit systems #else assert(JDI.ToUInt(-13 as Int8) == 0xfffffffffffffff3) // For 64-bit systems #endif assert(JDI.ToUInt(42 as Int32) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt(-13 as Int32) == 0xfffffff3) // For 32-bit systems #else assert(JDI.ToUInt(-13 as Int32) == 0xfffffffffffffff3) // For 64-bit systems #endif assert(JDI.ToUInt(42 as Int64) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt(-13 as Int64) == 0xfffffff3) // For 32-bit systems assert(JDI.ToUInt(Int64.max - 12) == 0xfffffff3) #else assert(JDI.ToUInt(-13 as Int64) == 0xfffffffffffffff3) // For 64-bit systems assert(JDI.ToUInt(Int64.max - 12) == 0x7ffffffffffffff3) #endif assert(JDI.ToUInt(42 as Int) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt(Int.max - 12) == 0x7ffffff3) // For 32-bit systems #else assert(JDI.ToUInt(Int.max - 12) == 0x7ffffffffffffff3) // For 64-bit systems #endif assert(JDI.ToUInt(42 as UInt8) == 42) assert(JDI.ToUInt(0xf3 as UInt8) == 0xf3) assert(JDI.ToUInt(42 as UInt32) == 42) assert(JDI.ToUInt(0xfffffff3 as UInt32) == 0xfffffff3) assert(JDI.ToUInt(42 as UInt64) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt(UInt64.max - 12) == 0xfffffff3) // For 32-bit systems #else assert(JDI.ToUInt(UInt64.max - 12) == 0xfffffffffffffff3) // For 64-bit systems #endif assert(JDI.ToUInt(42 as UInt) == 42) #if (arch(i386) || arch(arm)) assert(JDI.ToUInt(UInt.max - 12) == 0xfffffff3) // For 32-bit systems #else assert(JDI.ToUInt(UInt.max - 12) == 0xfffffffffffffff3) // For 64-bit systems #endif print("\nTesting JDI complete.\n") }