
字节笔记本
2026年10月7日 · 约 2 分钟读完
监听的通知名没有声明
视图里 onReceive 订阅 NotificationCenter 的某个名字。有一版订阅的是 dragStateChanged。这个静态成员写在 Notification.Name 的扩展里,字符串也是 "dragStateChanged"。同一名字若在拖动状态那个类型里再写一次,编译器报 Invalid redeclaration of 'dragStateChanged'。回答把视图里的那次声明删掉,并注释说名字已经在拖动状态里定义,这里不要再声明。
监听换成了没有成员的名字
下一则错误是:Type 'Notification.Name' has no member 'dragEnded',列号在监听那一行。订阅写成了 .dragEnded。扩展里当时只有 dragStateChanged,没有 dragEnded。类型上不存在的静态成员,点出来就会停在这一列。发出通知的代码若仍用 dragStateChanged,监听却等 dragEnded,即使后来补上声明,也要两边用同一个名字,否则一边发出、一边听不到。
补丁在扩展里同时写了 dragStateChanged 和 dragEnded,各自用同名字符串构造。若 dragStateChanged 仍留在另一个类型里,重复声明会再出现。注释要求不要重复声明状态这个名字,扩展里却又写上了它。

滚动区域多次写成 showsIndicators: false。这只隐藏滚动条,不声明通知名字。编译错误在名字上,不在滚动条是否还显示。用户说仍然有一块显示,那是界面。能通过编译之前,监听的名字必须先是类型上的成员。
声明和订阅要是同一个
名字要有一处声明。订阅、发送都用这一处。结束和状态变化若是两件事,就两个成员,并且各只写一次。把结束写进订阅、却只声明状态变化,编译器会指出没有这个成员。再在视图里声明一遍状态变化,又会报重复声明。

先定通知叫哪一个,只声明一次,发送和监听都用它。不要在视图里再声明已经存在的名字,也不要监听一个还没声明的名字。



