Skip to content

Commit d1cbb51

Browse files
committed
Implement From for Id<NSArray> as an example
1 parent e825bd2 commit d1cbb51

3 files changed

Lines changed: 50 additions & 10 deletions

File tree

objc2-foundation/examples/basic_usage.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use objc2::rc::autoreleasepool;
1+
use objc2::rc::{autoreleasepool, Id};
22
use objc2_foundation::{NSArray, NSCopying, NSDictionary, NSObject, NSString};
33

44
fn main() {
@@ -14,14 +14,14 @@ fn main() {
1414

1515
// Create an NSArray from a Vec
1616
let objs = vec![obj, obj2];
17-
let array = NSArray::from_vec(objs);
17+
let array: Id<NSArray<_, _>, _> = objs.into();
1818
for obj in array.iter() {
1919
println!("{:?}", obj);
2020
}
2121
println!("{}", array.len());
2222

2323
// Turn the NSArray back into a Vec
24-
let mut objs = NSArray::into_vec(array);
24+
let mut objs = Vec::from(array);
2525
let obj = objs.pop().unwrap();
2626

2727
// Create an NSString from a str slice

objc2-foundation/src/array.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,37 @@ impl<T: Message> DefaultId for NSArray<T, Shared> {
215215
}
216216
}
217217

218+
impl<T: Message, O: Ownership> From<Id<NSArray<T, O>, Owned>> for Vec<Id<T, O>> {
219+
fn from(array: Id<NSArray<T, O>, Owned>) -> Self {
220+
let vec: Vec<&T> = (&*array).into();
221+
vec.into_iter()
222+
.map(|obj| unsafe { Id::retain(obj.into()) })
223+
.collect()
224+
}
225+
}
226+
227+
impl<T: Message, O: Ownership> From<Vec<Id<T, O>>> for Id<NSArray<T, O>, Owned> {
228+
fn from(vec: Vec<Id<T, O>>) -> Self {
229+
unsafe { from_refs(vec.as_slice_ref()) }
230+
}
231+
}
232+
233+
impl<'a, T: Message, O: Ownership> From<&'a NSArray<T, O>> for Vec<&'a T> {
234+
fn from(array: &'a NSArray<T, O>) -> Self {
235+
array.objects_in_range(0..array.count())
236+
}
237+
}
238+
239+
impl<T: Message> From<&'_ NSArray<T, Shared>> for Vec<Id<T, Shared>> {
240+
fn from(array: &NSArray<T, Shared>) -> Self {
241+
array
242+
.objects_in_range(0..array.count())
243+
.into_iter()
244+
.map(|obj| unsafe { Id::retain(obj.into()) })
245+
.collect()
246+
}
247+
}
248+
218249
impl<T: Message, O: Ownership> NSMutableArray<T, O> {
219250
unsafe_def_fn!(pub fn new -> Owned);
220251

@@ -378,6 +409,12 @@ impl<T: Message, O: Ownership> DefaultId for NSMutableArray<T, O> {
378409
}
379410
}
380411

412+
impl<T: Message, O: Ownership> From<Vec<Id<T, O>>> for Id<NSMutableArray<T, O>, Owned> {
413+
fn from(vec: Vec<Id<T, O>>) -> Self {
414+
unsafe { from_refs(vec.as_slice_ref()) }
415+
}
416+
}
417+
381418
#[cfg(test)]
382419
mod tests {
383420
use alloc::format;
@@ -395,7 +432,7 @@ mod tests {
395432
for _ in 0..len {
396433
vec.push(NSObject::new());
397434
}
398-
NSArray::from_vec(vec)
435+
vec.into()
399436
}
400437

401438
fn sample_number_array(len: u8) -> Id<NSArray<NSValue<u8>, Shared>, Shared> {
@@ -517,7 +554,7 @@ mod tests {
517554
fn test_into_vec() {
518555
let array = sample_array(4);
519556

520-
let vec = NSArray::into_vec(array);
557+
let vec = Vec::from(array);
521558
assert_eq!(vec.len(), 4);
522559
}
523560

@@ -566,7 +603,7 @@ mod tests {
566603
#[test]
567604
fn test_sort() {
568605
let strings = vec![NSString::from_str("hello"), NSString::from_str("hi")];
569-
let mut strings = NSMutableArray::from_vec(strings);
606+
let mut strings: Id<NSMutableArray<_, _>, Owned> = strings.into();
570607

571608
autoreleasepool(|pool| {
572609
strings.sort_by(|s1, s2| s1.as_str(pool).len().cmp(&s2.as_str(pool).len()));

objc2-foundation/src/enumerator.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,16 @@ impl<'a, C: NSFastEnumeration + ?Sized> Iterator for NSFastEnumerator<'a, C> {
167167

168168
#[cfg(test)]
169169
mod tests {
170+
use alloc::vec::Vec;
171+
use objc2::rc::Id;
172+
170173
use super::NSFastEnumeration;
171174
use crate::{NSArray, NSValue};
172175

173176
#[test]
174177
fn test_enumerator() {
175-
let vec = (0usize..4).map(NSValue::new).collect();
176-
let array = NSArray::from_vec(vec);
178+
let vec: Vec<_> = (0usize..4).map(NSValue::new).collect();
179+
let array: Id<NSArray<_, _>, _> = vec.into();
177180

178181
let enumerator = array.iter();
179182
assert_eq!(enumerator.count(), 4);
@@ -184,8 +187,8 @@ mod tests {
184187

185188
#[test]
186189
fn test_fast_enumerator() {
187-
let vec = (0usize..4).map(NSValue::new).collect();
188-
let array = NSArray::from_vec(vec);
190+
let vec: Vec<_> = (0usize..4).map(NSValue::new).collect();
191+
let array: Id<NSArray<_, _>, _> = vec.into();
189192

190193
let enumerator = array.iter_fast();
191194
assert_eq!(enumerator.count(), 4);

0 commit comments

Comments
 (0)