File tree Expand file tree Collapse file tree 2 files changed +30
-2
lines changed Expand file tree Collapse file tree 2 files changed +30
-2
lines changed Original file line number Diff line number Diff line change @@ -3912,7 +3912,7 @@ public func _createOffsetBasedKeyPath(
3912
3912
// The buffer header is 32 bits, but components must start on a word
3913
3913
// boundary.
3914
3914
let kpBufferSize = MemoryLayout < Int > . size + MemoryLayout < Int32 > . size
3915
- return kpTy. _create ( capacityInBytes: kpBufferSize) {
3915
+ let kp = kpTy. _create ( capacityInBytes: kpBufferSize) {
3916
3916
var builder = KeyPathBuffer . Builder ( $0)
3917
3917
let header = KeyPathBuffer . Header (
3918
3918
size: kpBufferSize - MemoryLayout< Int> . size,
@@ -3923,7 +3923,7 @@ public func _createOffsetBasedKeyPath(
3923
3923
builder. pushHeader ( header)
3924
3924
3925
3925
let componentHeader = RawKeyPathComponent . Header (
3926
- stored: . struct,
3926
+ stored: _MetadataKind ( root ) == . struct ? . struct : . class ,
3927
3927
mutable: false ,
3928
3928
inlineOffset: UInt32 ( offset)
3929
3929
)
@@ -3935,6 +3935,12 @@ public func _createOffsetBasedKeyPath(
3935
3935
3936
3936
component. clone ( into: & builder. buffer, endOfReferencePrefix: false )
3937
3937
}
3938
+
3939
+ if _MetadataKind ( root) == . struct {
3940
+ kp. assignOffsetToStorage ( offset: offset)
3941
+ }
3942
+
3943
+ return kp
3938
3944
}
3939
3945
3940
3946
@_spi ( ObservableRerootKeyPath)
Original file line number Diff line number Diff line change @@ -1073,6 +1073,16 @@ struct Dog {
1073
1073
var age : Int
1074
1074
}
1075
1075
1076
+ class Cat {
1077
+ var name : String
1078
+ var age : Int
1079
+
1080
+ init ( name: String , age: Int ) {
1081
+ self . name = name
1082
+ self . age = age
1083
+ }
1084
+ }
1085
+
1076
1086
if #available( SwiftStdlib 5 . 9 , * ) {
1077
1087
keyPath. test ( " _createOffsetBasedKeyPath " ) {
1078
1088
let dogAgeKp = _createOffsetBasedKeyPath (
@@ -1086,6 +1096,18 @@ if #available(SwiftStdlib 5.9, *) {
1086
1096
let sparky = Dog ( name: " Sparky " , age: 7 )
1087
1097
1088
1098
expectEqual ( sparky [ keyPath: dogAgeKp!] , 7 )
1099
+
1100
+ let catNameKp = _createOffsetBasedKeyPath (
1101
+ root: Cat . self,
1102
+ value: String . self,
1103
+ offset: 16
1104
+ ) as? KeyPath < Cat , String >
1105
+
1106
+ expectNotNil ( catNameKp)
1107
+
1108
+ let chloe = Cat ( name: " Chloe " , age: 4 )
1109
+
1110
+ expectEqual ( chloe [ keyPath: catNameKp!] , " Chloe " )
1089
1111
}
1090
1112
}
1091
1113
You can’t perform that action at this time.
0 commit comments