Int()和toInt()之间的快速差异

时间:2015-03-21 13:29:01

标签: swift

我需要简单的解释为什么我使用toInt()将字符串转换为整数。

我何时需要使用Int(variable)代替variable.toInt()

2 个答案:

答案 0 :(得分:5)

Swift的Int没有接受String的构造函数。

只要您想将String转换为Int就必须使用variable.toInt()

如果Int(variable)的类型位于以下列表中,则只能使用variable

  • Int
  • UInt8
  • Int8
  • UInt16
  • Int16
  • UInt32
  • Int32
  • UInt64
  • Int64
  • UInt
  • Float
  • Double
  • Float80
  • 您为自定义Int extension编写的任何其他类型,并为其添加自定义init

对于任何其他类型,您必须使用可用的toInt()方法(如果存在),或者自己编写。

此列表中的内容与此列表中未包含的内容之间的主要区别在于,Int在很大程度上可以准确地表示此列表中的所有内容。任何这些类型都不需要failable initializer

但是,在尝试将"Hello World!"转换为Int时,我们应该返回什么? String' toInt()返回nil,因为String toInt()的返回类型为Int?Int可选)。要在init中执行相同操作,init必须可以使用(我已在答案的底部发布了一个示例)。

但是,如果要实现结构Rational来表示有理分数,那么扩展Int以包含接受Rational数字的构造函数可能是有意义的:

extension Int {
    init(_ value: Rational) {
        // your implementation
    }
}

以下是Int的可用构造函数列表(您可以使用Int(variable)的情况:

/// A 64-bit signed integer value
/// type.
struct Int : SignedIntegerType {
    /// Create an instance initialized to zero.
    init()
    /// Create an instance initialized to `value`.
    init(_ value: Int)    
    /// Creates an integer from its big-endian representation, changing the
    /// byte order if necessary.
    init(bigEndian value: Int)

    /// Creates an integer from its little-endian representation, changing the
    /// byte order if necessary.
    init(littleEndian value: Int)
    init(_builtinIntegerLiteral value: Builtin.Int2048)

    /// Create an instance initialized to `value`.
    init(integerLiteral value: Int)
}
extension Int {
    init(_ v: UInt8)
    init(_ v: Int8)
    init(_ v: UInt16)
    init(_ v: Int16)
    init(_ v: UInt32)
    init(_ v: Int32)
    init(_ v: UInt64)

    /// Construct a `Int` having the same bitwise representation as
    /// the least significant bits of the provided bit pattern.
    ///
    /// No range or overflow checking occurs.
    init(truncatingBitPattern: UInt64)
    init(_ v: Int64)

    /// Construct a `Int` having the same bitwise representation as
    /// the least significant bits of the provided bit pattern.
    ///
    /// No range or overflow checking occurs.
    init(truncatingBitPattern: Int64)
    init(_ v: UInt)

    /// Construct a `Int` having the same memory representation as
    /// the `UInt` `bitPattern`.  No range or overflow checking
    /// occurs, and the resulting `Int` may not have the same numeric
    /// value as `bitPattern`--it is only guaranteed to use the same
    /// pattern of bits.
    init(bitPattern: UInt)
}
extension Int {
    /// Construct an instance that approximates `other`.
    init(_ other: Float)
    /// Construct an instance that approximates `other`.
    init(_ other: Double)
    /// Construct an instance that approximates `other`.
    init(_ other: Float80)
}

(您可以通过在Swift中的某处键入Int(0),右键单击并单击"跳转到定义"来到达此列表。)

请注意,其中所有只是Int(variable),其中一些必须像Int(littleEndian:variable)一样使用。

使用Int(variable) variable String Int的唯一方法是将自己的扩展名添加到extension Int { init?(_ s: String) { if let i = s.ToInt() { init(i) } else { init(0) return nil } } }

variable.ToInt()

但我建议坚持使用{{1}}。

答案 1 :(得分:3)

Int(variable)是一个构造函数,它有一组类型可用于创建Int变量。

.toInt()类似于可以应用于任何数据类型(支持该扩展)的扩展,并且数据类型不需要是Int构造函数支持的类型之一。如果数据类型知道如何将自身转换为Int,则可以使用toInt()函数扩展其功能。