How do I do indexOfObject or a proper containsObject

后端 未结 8 896
说谎
说谎 2020-12-03 03:00

With an array: How do I do indexOfObject or a proper containsObject?

I mean I know I could just bridge the Array to NSArray an

相关标签:
8条回答
  • 2020-12-03 03:45

    It appears that not all of the toll-free bridging from NS/CF space is in place. However, if you declare your array as an NSArray, it works fine:

    let     fruits: NSArray = [ "apple", "orange", "tomato (really?)" ]
    let     index = fruits.indexOfObject("orange")
    
    println("Index of Orange: \(index)")
    
    0 讨论(0)
  • 2020-12-03 03:47

    Its actually able to be done in Swift. To get the index use find(YourArray, ObjectToFind)

    0 讨论(0)
  • 2020-12-03 03:47

    As I was told, this isn't available yet / I have to bridge it to NSArray

    I don't like this and it feels dirty so I went and did this in an extension. that way it hides the usage of NSArray and allows apple to provide it later

    import Foundation
    
    extension Array {
        func contains(object:AnyObject!) -> Bool {
            if(self.isEmpty) {
                return false
            }
            let array: NSArray = self.bridgeToObjectiveC();
    
            return array.containsObject(object)
        }
    
        func indexOf(object:AnyObject!) -> Int? {
            var index = NSNotFound
            if(!self.isEmpty) {
                let array: NSArray = self.bridgeToObjectiveC();
                index = array.indexOfObject(object)
            }
            if(index == NSNotFound) {
                return Optional.None;
            }
            return index
        }
    
        //#pragma mark KVC
    
        func getKeyPath(keyPath: String!) -> AnyObject! {
            return self.bridgeToObjectiveC().valueForKeyPath(keyPath);
        }
    }
    

    https://gist.github.com/Daij-Djan/9d1c4b1233b4017f3b67

    0 讨论(0)
  • 2020-12-03 03:50

    If your array elements are objects and you want to find an identical object in that array, you can use this function:

    func findObject<C: CollectionType where C.Generator.Element: AnyObject>(domain: C, value: C.Generator.Element) -> Int? {
        for (index, element) in enumerate(domain) {
            if element === value {
                return index
            }
        }
    
        return nil
    }
    
    0 讨论(0)
  • 2020-12-03 03:51

    Apple provide an example of exactly this in the The Swift Programming Language book. Specifically, see the section on Type Constraints in Action (p621 in the iBook).

    func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
        for (index, value) in enumerate(array) {
            if value == valueToFind {
                return index
            }
        }
        return nil
    }
    

    Everything depends upon your type implementing Equatable.

    The Swift Programming Language covers that and explains how to implement that protocol:

    “The Swift standard library defines a protocol called Equatable, which requires any conforming type to implement the equal to operator (==) and the not equal to operator (!=) to compare any two values of that type. ”

    NSHipster has a couple of relevant posts on this subject:

    Swift Default Protocol Implementations Swift Comparison Protocols

    I also found this answer very useful in implementing Equatable:

    How do I implement Swift's Comparable protocol?

    Alhough it mentions Comparable, Equatable is a subset and the explanation is good.

    Excerpts above from: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/gb/jEUH0.l

    0 讨论(0)
  • 2020-12-03 03:55

    You can't. That's why NSArray is still there. However, the Apple documentation reads as follows about String and NSString:

    Swift’s String type is bridged seamlessly to Foundation’s NSString class. If you are working with the Foundation framework in Cocoa or Cocoa Touch, the entire NSString API is available to call on any String value you create, in addition to the String features described in this chapter. You can also use a String value with any API that requires an NSString instance.

    Following that approach, the NSArray API should be available on Array, but it isn't because the native Swift Array is a primitive (most likely a struct or similar), so you have to "convert" it to an NSArray.

    0 讨论(0)
提交回复
热议问题