2017-04-13 18 views
5

Xét đoạn mã sau:Làm cách nào để khắc phục cảnh báo nhập kiểu trong câu lệnh 'if let' trong Xcode 8.3?

let nsdate: NSDate? = NSDate() 
if let date = nsdate as? Date { // a warning occurs here 
    print(date) 
} 

Trình biên dịch phàn nàn như thế này: Conditional downcast from 'NSDate?' to 'Date' is a bridging conversion; did you mean to use 'as'?

Một dàn diễn viên NSData-Data có cùng một vấn đề. Làm thế nào để sửa chữa nó?

+0

FYI: Swift 3 trình biên dịch không phàn nàn về code của bạn ;-) Nên là Swift 3.1 ... –

+0

Cảnh báo sẽ xảy ra sau khi cập nhật lên Xcode 8.3.1. Tôi đã thử nó ở sân chơi. –

+2

Tại sao bạn khai báo hằng số ** tùy chọn ** nhưng gán giá trị ** không tùy chọn **. Thật điên rồ. ** Không chú thích các loại trình biên dịch có thể suy luận **. Bạn làm cho nó tồi tệ hơn. – vadian

Trả lời

17

Cố gắng đúc để dữ liệu tùy chọn:

if let date = nsdate as Date? 

Bạn đang cố gắng tùy chọn diễn viên của tùy chọn NSDate để NON tùy chọn ngày. Miễn là NSDate được bắc cầu từ obj-c thành Date, do đó, dàn diễn viên này luôn thành công, vì vậy không cần diễn viên tùy chọn ở đây, chỉ cần dàn diễn viên cơ bản as là đủ. Sau đó, bạn cần phải đúc giá trị tùy chọn, do đó kết quả giá trị phải là tùy chọn quá, do đó Date? là thích hợp ở đây.

5

Swift 3.1 phân biệt

  • Một tùy chọn xuống cast as? Foo

    phôi một unspecific hơn với một loại hình cụ thể hơn ví dụ

    let dict : [String:Any] = ["Foo" : 12] 
    let number = dict["Foo"] as? Int 
    
  • Một cầu dàn diễn viên của một loại tùy chọn as Foo?

    cầu một (Core) Foundation loại đến một số điện thoại miễn phí Swift loại và ngược lại.

    Nó tương đương với tùy chọn của cú pháp không bắt buộc thông thường

    let string : NSString = "Foo" 
    let swiftString = string as String 
    

Sự khác biệt là tinh tế cho các nhà phát triển nhưng rất hữu ích cho trình biên dịch.

Về cơ bản, không sử dụng các lớp Foundation NS... Foundation trong Swift 3 nếu có bản sao Swift gốc.

0

Hãy thử điều này:

let nsdate: NSDate? = NSDate() 

if let date = nsdate { 
    print(date) 
} 

Trình biên dịch biết Nó rất một NSDate nếu tháo, vì vậy những gì bạn đang làm là thực sự đúc một NSDate đến một ngày

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