2014-06-25 18 views
15

Có khó khăn để tìm ra cách để thực hiện cuộc gọi sau trong nhanh chóng:NSURL getResourceValue trong nhanh chóng

var anyError: NSError? = nil 
var rsrc: NSNumber? = nil 
var success = url.getResourceValue(&rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError) 

Ở trên không biên dịch:

Cannot convert the expression's type 'Bool' to type 'inout Bool' 

Vì vậy, tôi cố gắng này:

var anyError: NSError? = nil 
var rsrc: AutoreleasingUnsafePointer<AnyObject?> = nil 
var success = url.getResourceValue(rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError) 

nhưng điều này tạo ra lỗi thời gian chạy EXC_BAD_ACCESS.

Làm thế nào để vượt qua trong arg đầu tiên dự kiến ​​như AutoreleasingUnsafePointer<AnyObject?> (mà phải trỏ đến một NSNumber boolean theo doc), và sau đó có thể kiểm tra giá trị Bool dự kiến ​​của nó?

Trả lời

28

Bạn cần phải thực hiện một rsrc AnyObject tùy chọn và vượt qua nó bằng cách tham khảo như sau:

var anyError: NSError? 
var rsrc: AnyObject? 
var success = url.getResourceValue(&rsrc, forKey:NSURLIsUbiquitousItemKey, error:&anyError) 

Note: Bạn không cần phải khởi tạo Optionals để nil, chúng được thiết lập để nil theo mặc định.

Nếu sau đó bạn muốn kiểm tra nếu giá trị là một NSNumber sau đó bạn có thể làm một sự chuyển đổi:

if let number = rsrc as? NSNumber { 
    // use number 
} 
+0

Cảm ơn, đã không thử điều đó, mặc dù tôi đã trở nên khá sáng tạo trong nỗ lực của mình ... Câu trả lời r thực sự đúng trong câu hỏi của tôi. Cảm ơn. Sẽ chấp nhận. – CMont

7

Dưới đây là mã drewag của cập nhật cho Swift 2,0

do { 
     var rsrc: AnyObject? 
     try element.getResourceValue(&rsrc, forKey: NSURLIsDirectoryKey) 
     if let number = rsrc as? NSNumber { 
      if number == true { 
       // do something 
      } 
     } 
    } catch { 
    } 
+1

Mã này đưa ra lỗi phân đoạn 11, bất kỳ ý tưởng nào tại sao? – H4Hugo

0

Nếu getResourceValue (: forKey :) kết quả cuối cùng là một giá trị logic, bạn có thể truyền trực tiếp giá trị con trỏ trả về giá trị Bool:

let boolResult = rsrc as! Bool 

hoặc đơn giản là kiểm tra nó như là một giá trị Bool mà không gán nó:

if rsrc as! Bool { 
    // true code 
} else { 
    // false code 
} 

hoặc làm cả hai:

if let rsrc as! Bool { 
    // true 
} else { 
    // false 
} 
5

trong nhanh chóng 3 cuộc gọi trước đó không có sẵn/chấp nhận:

nên sử dụng:

var keys = Set<URLResourceKey>() 
keys.insert(URLResourceKey.isDirectoryKey) 
do{ 
    let URLResourceValues = try fileURL.resourceValues(forKeys: keys) 
    }catch _{ 

    } 
Các vấn đề liên quan