gpt4 book ai didi

swift - Swift 中的文字可转换

转载 作者:行者123 更新时间:2023-11-28 06:19:42 25 4
gpt4 key购买 nike

我想知道 Literal Convertibles 在 Swift 中是如何工作的。我所知道的一点是,在 var myInteger = 5 中,myInteger 神奇地变成了 Int 是因为 Int 采用了一种协议(protocol),ExpressibleByIntegerLiteral 而我们不必执行 var myInteger = Int(5)。类似地,StringArrayDictionary 等都符合一些 Literal 协议(protocol)。我的问题是

  1. 我对 Literal Convertibles 的了解是否正确?
  2. 我们如何在我们自己的类型中实现这些。例如

 class Employee {
var name: String
var salary: Int
// rest of class functionality ...
}

我如何实现文字协议(protocol)来执行 var employee :Employee = "John Doe" 这将自动将“John Doe”分配给员工的姓名属性。

最佳答案

  1. 您对各种ExpressibleBy...Literal 协议(protocol)的理解部分正确。当 Swift 编译器将您的源代码解析为 Abstract Syntax Tree 时, 它已经识别出什么文字代表什么数据类型:5Int 类型的文字,["name": "John"]Dictionary 等类型的文字。为了完整性,Apple 使基本类型符合这些协议(protocol)。
  2. 您可以采用这些协议(protocol),让您的类有机会从编译时常量进行初始化。但用例非常狭窄,我看不出它如何适用于您的特定情况。

例如,如果您想让您的类符合 ExpressibleByStringLiteral,请添加一个初始化程序以从 String 设置您的所有属性:

class Employee: ExpressibleByStringLiteral {
typealias StringLiteralType = String

var name: String
var salary: Int

required init(stringLiteral value: StringLiteralType) {
let components = value.components(separatedBy: "|")
self.name = components[0]
self.salary = Int(components[1])!
}
}

然后你可以像这样初始化你的类:

let employee1: Employee = "John Smith|50000"

但是如果你梦想着写这样的东西,那是不允许的:

let str = "Jane Doe|60000"
let employee2: Employee = str // error

如果您为 salary 传递了错误的数据类型,这将是运行时错误而不是编译时错误:

let employee3: Employee = "Michael Davis|x" // you won't know this until you run the app

TL,DR:滥用这些 ExpressibleBy...Literal 类型是一个非常糟糕的主意。

关于swift - Swift 中的文字可转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com