如何模仿描述输出?

2024-01-12

想象一下水果类:

class Fruit: NSObject {
    override var description:String {
        return super.description
    }
}

var apple = Fruit()
var banana = Fruit()

print(apple)  // Output: <MyProject.Fruit: 0x7fa719627e00>
print(banana) // Output: <MyProject.Fruit: 0x7fa71962dab0>

问题:你如何模仿这个输出?

我目前有以下内容:

class Fruit: NSObject {
    override var description:String {
        print(super.description)
        return "<\(NSStringFromClass(self.dynamicType)): 0x\(String(self.hash, radix:16))>"
    }
}

现在输出以下内容:

<MyProject.Fruit: 0x7fb958c289a0>
<MyProject.Fruit: 0x7fb958c289a0>
<MyProject.Fruit: 0x7fb958c22df0>
<MyProject.Fruit: 0x7fb958c22df0>

正如你所看到的,输出是相同的,这正是我想要的。现在我想知道这是否是模仿其输出的正确方法,或者我忽略了下面评论中提到的内容。

致谢:Matt、Martin R 和 Vacawama


的任何子类NSObject继承了description https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/index.html#//apple_ref/occ/intfm/NSObject/description的方法NSObject(定义在NSObjectProtocol):

class Foo1 : NSObject { }
print(Foo1())
// <MyProject.Foo1: 0x100612fd0>

这个“默认实现”打印类名和内存 对象的地址,例如周五问答 2013-01-25:让我们构建 NSObject https://mikeash.com/pyblog/friday-qa-2013-01-25-lets-build-nsobject.html,其中显示了 Objective-C 的实现方式 可能看起来像:

- (NSString *)description
{
    return [NSString stringWithFormat: @"<%@: %p>", [self class], self];
}

The %pformat 将指针的值打印为十六进制数, 之前是0x.

为了在 Swift 中模仿,我们可以使用

  • String(reflecting: self.dynamicType)它以字符串形式返回完全限定的类名,并且
  • unsafeAddressOf(self)它返回一个指向存储的指针 的对象。

示例(使用方括号[]证明 使用重写方法):

class Foo2 : NSObject {
    override var description : String {
        let className = String(reflecting: self.dynamicType)
        let address = unsafeAddressOf(self)
        return String(format: "[%@: %p]", className, address)
    }
}
print(Foo2())
// [MyProject.Foo2: 0x100613310]

class Foo3 : Foo2 { }
print(Foo3())
// [MyProject.Foo3: 0x102000540]

这也适用于“纯 Swift 类”,因为没有基础 使用方法:

class Bar : CustomStringConvertible {
    var description : String {
        let className = String(reflecting: self.dynamicType)
        let address = unsafeAddressOf(self)
        return String(format: "[%@: %p]", className, address)
    }
}
print(Bar())
// [MyProject.Bar: 0x102001200]

请注意(正如上面的评论中已经提到的),哈希值 对象的地址不一定与内存地址相同。 一个简单的例子是NSArray()其哈希值只是数字 元素数量:

let array = NSArray(objects: 1, 2, 3)
print(unsafeAddressOf(array)) // 0x00000001020011a0
print(array.hashValue) // 3

Swift 3 更新:

class Bar : CustomStringConvertible {
    var description : String {
        let className = String(reflecting: type(of: self))
        let address = Unmanaged.passUnretained(self).toOpaque()
        return "[\(className): \(address)]"
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模仿描述输出? 的相关文章

随机推荐

  • 如何同步远程服务器数据库与本地数据库

    我想在期间获取从远程服务器数据库到本地数据库的单个表的所有详细信息页面加载事件或其他一些好的方法 应该作为后端进程发生 任何人都可以帮助我解决这个问题 1 在桌面和 Web 应用程序中创建的单个应用程序 2 当用户在桌面应用程序中注册新客户
  • Quarkus 自定义授权拦截器

    我有一个 Quarkus 微服务 使用 quarkus oidc 和 quarkus keycloak authorization 扩展通过 Keycloak 进行身份验证和授权 我需要另外实现以下两个请求拦截器 过滤器 任何身份验证逻辑启
  • 如何阻止 ejabberd 使用 mnesia [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试建立一个将数据库从崩溃的服务器恢复到新服务器的过程 我的服务器正在运行 Ejabberd 作为 XMPP 服务器 并且我将其配置为使用 po
  • Sublime Text 中 >= 和 <= 运算符的语法高亮显示

    我正在尝试为 Matlab 运算符获得正确的语法突出显示 gt and lt 目前 仅 lt and gt 被突出显示 而不是 但例如 被突出显示 我看过Matlab tmLanguage文件 以及两者 gt and lt 包含在运算符正则
  • 向 CreateThread 传递多个参数

    问题 How to pass具体来说two论点创建线程 http msdn microsoft com en us library ms682453 VS 85 aspx when 参数一 类型SOCKET 论证二 一个接口指针 COM S
  • Django 文件字段编码

    我有一个 django 模型如下 class ExportFile BaseExportFile created timestamp models DateTimeField auto now True editable False dat
  • 使用 d3.js 制作分组条形图

    我是 d3 js 的新手 我发现很难创建分组条形图 但我尝试了一些似乎不正确的方法 我想要 x 轴上的月份和 y 轴上的组数 火星和木星 像这样的东西Link https i stack imgur com VowEA png var sv
  • 在 Jsch 中设置 ASCII 模式

    我需要解决当前遇到的 Unix Windows 文件格式 LF 到 CRLF 问题 我使用的 ftp 客户端是 Jcraft 的 Jsch 在线文档非常简单 尽管我遇到了一个可以设置的标志 SSH FXF TEXT MODE 启用 ASCI
  • 类方法无法访问属性

    我创建了一个像这样的类 function MyClass var myInt 1 MyClass prototype EventHandler function e alert this myInt 不幸的是 this是触发的事件 在我的例
  • 如何将大型多维数组部分写入 HDF5 文件?

    我在 C 中使用 HDF5DotNet 并且有一个非常大的数组 几个 GB 我想将其写入 HDF5 文件 它太大了 无法将整个内容存储在内存中 因此我一次生成它的区域并想将它们写出来 但在读回时仍然让它看起来像一个大数组 我知道 HDF5
  • 背景图像占窗口的 100%(并随之调整大小)

    重复 拉伸和缩放 CSS 背景 https stackoverflow com questions 376253 stretch and scale css background 如何拉伸背景图像以覆盖整个 HTML 元素 https st
  • PHP 对象数组不是线性缩放的,而全局数组却可以?

    使用对象内数组作为属性与使用全局 php 数组变量相比 存在一个主要的性能问题 为什么 为了对这个问题进行基准测试 我创建了以下基准测试 它存储一个越来越大的数组 并以 stdClass 作为节点 运行了两个测试 一个使用类中的数组属性 另
  • 如何阅读Haskell中内置函数的实现代码/源代码?

    例如 如果我想阅读默认的源代码curryPrelude 中的函数 我在哪里引用 有没有办法阅读它的实现 我尝试在Hoogle中搜索它 但它没有给出确切的实现 只是给出了输入和输出类型 我在堆栈上使用 GHCI 来运行 haskell 胡格尔
  • SQL查询的执行顺序

    我对该查询的执行顺序感到困惑 请解释一下 我对何时应用联接 调用函数 随案例添加新列以及何时添加序列号感到困惑 请解释这一切的执行顺序 select Row number OVER ORDER BY SELECT 1 AS Serial N
  • sql server 中的多个 NOT LIKE

    我有一张像这样的桌子 id name 302345 Name1 522345 Name2 1X2345 Name3 2X2345 Name4 1X8765 Name5 2X2123 Name6 502345 Name7 M62345 Nam
  • 为什么食谱在看起来没有必要时提倡重写 getItemViewType 和 getViewTypeCount ?

    我一直在学习 Commonsware Android 编程教程 在教程 5 额外学分 2 中 挑战是根据对象的 类型名称 餐厅的 类型 属性 使用多种布局在 ListView 中显示行 这是一个字符串 因此 它建议重写getItemView
  • 替换lua中包含特殊字符的字符串

    我想替换lua中的字符串 这是字符串 strng begin matrix 1 2 3 4 5 6 7 8 10 end matrix 我想更换 begin matrix by by by end matrix by 我还想删除所有空格 所
  • Python 3 静态成员

    我正在努力实现以下目标 class A username None username get username def get username self if username is None try uname os environ U
  • npm 命令 - 是否需要 sudo?

    目前我总是跑步sudo npm install
  • 如何模仿描述输出?

    想象一下水果类 class Fruit NSObject override var description String return super description var apple Fruit var banana Fruit p