gpt4 book ai didi

arrays - 扩展数组以支持自定义日志记录

转载 作者:行者123 更新时间:2023-11-30 12:16:23 24 4
gpt4 key购买 nike

我有以下代码,其中定义了 Loggable协议(protocol),我想要任何 Array在我的应用程序中 Element类型符合Loggable可以很容易地转换成字符串。

//: Playground - noun: a place where people can play

import UIKit

protocol Loggable {
var logDescription: String { get }
}

struct Node: CustomStringConvertible {
let id: Int

var description: String {
return "node: \(self.id) \n"
}
}

let node1 = Node(id: 1)
let node2 = Node(id: 2)

let nodes = [node1, node2]

print(nodes)

extension Array: Loggable where Element: Loggable {

var logDescription: String {
var message = ""
for element in self {
message += element.logDescription
}
return message
}
}


struct Logger {
static func log(item: Loggable) {
print(item.logDescription)
}
}


Logger.log(item: nodes)

不幸的是,我得到Extension of type 'Array' with constraints cannot have an inheritance clause 。有办法完成我想做的事情吗?

更广泛地说,如果有任何关于使用 Swift 功能来实现更清晰的日志消息的建议或链接,我将不胜感激。

最佳答案

您的总体思路是正确的,但在执行过程中出现了一些错误:

  1. 首先,您需要使数组元素 Node 符合 Loggable 协议(protocol)。数组本身不需要符合,因为它只是 Loggable 对象的容器

    struct Node: Loggable, CustomStringConvertible {
    let id: Int

    var description: String {
    return "node: \(self.id) \n"
    }

    var logDescription: String {
    return "logDescription"
    }
    }
  2. Logger 的日志函数修改为通用函数,并限制参数应符合 Loggable 协议(protocol)

    struct Logger {

    static func log<T>(item: T) where T: Loggable {
    print(item.logDescription)
    }

    static func log<T>(items: [T]) where T: Loggable {
    for item in items {
    print(item.logDescription)
    }
    }

    // Bonus functional points

    // static func log<T>(items: [T]) where T: Loggable {
    // items.forEach() { print($0.logDescription) }
    // }

    }
  3. 现在您可以按预期调用日志函数

    let node1 = Node(id: 1)
    let node2 = Node(id: 2)
    let nodes = [node1, node2]

    Logger.log(items: nodes)
<小时/>

您应该查看CustomDebugStringConvertible因为它实现了与标准库非常相似的功能。

关于arrays - 扩展数组以支持自定义日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394328/

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