Swift自定义类型的字面量赋值

本文介绍了Swift中的字面量类型和字面量协议,详细阐述了如何通过实现各种字面量协议让自定义类型支持字面量初始化。文中通过Price和Animal结构体的示例,展示了如何实现整数字面量、字符串字面量、数组字面量、字典字面量以及nil字面量,并讨论了BOOL类型的字面量赋值及其在分支语句中的使用问题。
摘要由CSDN通过智能技术生成

字面量类型

所谓字面量,就是指一段能表示特定类型的值(如字符串、布尔值)的值表达式。例如:

let number:Int = 6
let name: String = "Tom"

上面例子中,6、Tom 都是字面量。

所谓字面量类型,就是指支持通过字面量进行实例初始化的数据类型,如上面例子中的 Int、String 类型。

Swift 中的字面量类型有:

数值类型:Int、Double、Float 以及其相关类型(如 UInt、Int16、Int32等)
布尔值类型:Bool
字符串类型:String
组合类型:Array、Dictionary、Set
空类型:Nil

字面量协议

Swift 是如何让上述的数据类型具有字面量初始化的能力呢?答案是:实现指定的字面量协议。

所以,如果我们希望自定义的数据类型也能通过字面量进行初始化,只要实现对应的字面量协议即可。

Swift中的字面量协议主要有以下几个:

ExpressibleByNilLiteral // nil字面量协议
ExpressibleByIntegerLiteral // 整数字面量协议
ExpressibleByFloatLiteral // 浮点数字面量协议
ExpressibleByBooleanLiteral // 布尔值字面量协议
ExpressibleByStringLiteral // 字符串字面量协议
ExpressibleByArrayLiteral // 数组字面量协议
ExpressibleByDictionaryLiteral // 字典字面量协议

其中,ExpressibleByStringLiteral 字符串字面量协议还依赖于以下 2 个协议:

ExpressibleByUnicodeScalarLiteral
ExpressibleByExtendedGraphemeClusterLiteral

也就是说,实现 ExpressibleByStringLiteral 协议时,还需要实现其依赖的另外 2 个协议。

字面量协议实践

下面是自定义的结构体类型 Price,我们通过实现不同的字面量协议让它实现对应的字面量初始化功能:

struct Price {
   
    var value: Double
    
    init(_ value: Double) {
   
        self.value = value
    }
}
// 实现 CustomStringConvertible 协议,提供 description 方法
extension Price: CustomStringConvertible {
   
    public var description: String {
   
        return "Price(the value is \(value))"
    }
}

// 实现 ExpressibleByFloatLiteral 字面量协议
extension Price: ExpressibleByFloatLiteral {
   
    public init(floatLiteral value: FloatLiteralType) {
   
        self.init(value)
    }
}

// 实现 ExpressibleByIntegerLiteral 字面量协议
extension Price: ExpressibleByIntegerLiteral {
   
    public init(integerLiteral value: IntegerLiteralType) {
   
        self.init(Double(value))
    }
}

// 实现 ExpressibleByStringLiteral 字面量协议
extension Price: ExpressibleByStringLiteral {
   
    public init(stringLiteral value: StringLiteralType) {
   
        if let doubleValue = Double(value) {
   
            self.init(doubleValue)
        } else {
   
            self.init(0)
        }
    }
    
    // 实现 ExpressibleByExtendedGraphemeClusterLiteral 字面量协议
    public init(extendedGraphemeClusterLiteral value: StringLiteralType) {
   
        if let doubleValue = Double(value) {
   
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值