当前位置: 首页 > 面试题库 >

Swift 3中相互引用的结构

郑桐
2023-03-14
问题内容

我有两个具有一对一关系的CoreData实体。我想基于此实体创建结构。 我的代码:

struct DetailedPin {
     var pin: Pin?
}

struct Pin {
    var detailedPin: DetailedPin?  
}

但我收到一个错误:Value type 'DetailedPin' cannot have a stored property that references itself。和Pin结构相同的错误。我该如何处理?谢谢。


问题答案:

问题在于,一个inline Optional存储其Wrapped值(有关此信息,请参见Mike
Ash的精彩博客文章
)–意味着一个Optional实例(无论是否nil存在)将至少占用与所需类型相同的内存量存储在它的.some大小写(Wrapped类型)中。

因此,由于您的Pin结构具有type属性DetailedPin?,并且type
DetailedPin属性,Pin?因此需要无限存储才能内联存储这些值。

因此,解决方案只是添加一个间接层。一种这样做的方法是按照@dfri的建议进行make
Pin和/或DetailedPin引用类型(即aclass)。

但是,如果您希望保留Pinand 的值语义DetailedPin,则一种选择是创建一个由类实例支持的包装器类型,以提供必要的间接寻址:

/// Provides indirection for a given instance.
/// For value types, value semantics are preserved.
struct Indirect<T> {

  // Class wrapper to provide the actual indirection.
  private final class Wrapper {

    var value: T

    init(_ value: T) {
      self.value = value
    }
  }

  private var wrapper: Wrapper

  init(_ value: T) {
    wrapper = Wrapper(value)
  }

  var value: T {
    get {
      return wrapper.value
    }
    set {
      // Upon mutation of value, if the wrapper class instance is unique,
      // mutate the underlying value directly.
      // Otherwise, create a new instance.
      if isKnownUniquelyReferenced(&wrapper) {
        wrapper.value = newValue
      } else {
        wrapper = Wrapper(newValue)
      }
    }
  }
}

现在,您可以只将Indirect包装器用于您的structs属性中的一个(或两个):

struct DetailedPin {
  private var _pin = Indirect<Pin?>(nil)

  // Convenience computed property to avoid having to say ".value" everywhere.
  var pin: Pin? {
    get { return _pin.value }
    set { _pin.value = newValue }
  }
}

struct Pin {
  var detailedPin: DetailedPin?
  var foo: String
}

var d = DetailedPin()
var p = Pin(detailedPin: d, foo: "foo")
d.pin = p

// testing that value semantics are preserved...
var d1 = d
d1.pin?.foo = "bar"

print(d.pin?.foo as Any) // Optional("foo")
print(d1.pin?.foo as Any) // Optional("bar")


 类似资料:
  • 本文向大家介绍详解C语言中结构体的自引用和相互引用,包括了详解C语言中结构体的自引用和相互引用的使用技巧和注意事项,需要的朋友参考一下 结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针。 结构体的相互引用(mutual reference),就是说在多个结构体中,都包含指向其他结构体的指针。 1. 自引用 结构体 1.1 不使用typedef时 错误的

  • 有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形。比如类A有类型为B的成员,而类B又有类型为A的成员。 那么这种情形下,两个类的设计上需要注意什么呢? 同一文件 尝试方案 将A和B的定义都放在一个文件中,例如: #include <iostream> class A { public: A() { aa_ = 'A'; } char aa_;

  • 我理解A,我们在那里有一个原语;没有引用。by-复制。 我希望B和C的行为与D相同——根据它们被给予的引用而改变。 为什么这个对象引用另一个对象只对用户定义的对象“起作用”,而不是整数、字符串等。?

  • PDPage对象是否包含对其所属PDDocument的引用 换句话说,PDPage是否了解其PDDocument<在应用程序的某个地方,我有一个文档列表 这些文档被合并到一个新的PDDocument中: 然后将此PDI文档分成10个包: 我现在的问题是: 如果我循环遍历列表中这些拆分的PDDocuments的页面,是否有办法知道页面最初属于哪个PDDocument? 另外,如果你有一个PDPage

  • 我有两个类,一个被设计用来包含另一个 然而,我不能相互引用类类型(和),只能是其中之一。 我怎样才能在彼此之间引用这两个类类型呢?否则最好的方法是什么?

  • 本文向大家介绍Android总结之WebView与Javascript交互(互相调用),包括了Android总结之WebView与Javascript交互(互相调用)的使用技巧和注意事项,需要的朋友参考一下 前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App、Web App、Hybrid App三种方式,个人觉得目前以H