thế nào về giải pháp này, tôi đã thực hiện một phiên bản generic của trước câu trả lời.
fileprivate func unwrap<T>(value: Any)
-> (unwraped:T?, isOriginalType:Bool) {
let mirror = Mirror(reflecting: value)
let isOrgType = mirror.subjectType == Optional<T>.self
if mirror.displayStyle != .optional {
return (value as? T, isOrgType)
}
guard let firstChild = mirror.children.first else {
return (nil, isOrgType)
}
return (firstChild.value as? T, isOrgType)
}
let value: [Int]? = [0]
let value2: [Int]? = nil
let anyValue: Any = value
let anyValue2: Any = value2
let unwrappedResult:([Int]?, Bool)
= unwrap(value: anyValue) // ({[0]}, .1 true)
let unwrappedResult2:([Int]?, Bool)
= unwrap(value: anyValue2) // (nil, .1 true)
let unwrappedResult3:([UInt]?, Bool)
= unwrap(value: anyValue) // (nil, .1 false)
let unwrappedResult4:([NSNumber]?, Bool)
= unwrap(value: anyValue) ({[0]}, .1 false)
Sau đây là mã trên Sân chơi.
Tôi nghĩ rằng phương pháp này thất bại trong việc đúc 'Any' đến một tùy chọn gõ vào Swift 3/xcode 8. – SimplGy
Ah hah! chữ thường "s" trong 'some'. Ghi chú phát hành đọc hữu ích đôi khi! Đối với nhanh 3, sử dụng 'let z = Mirror (phản ánh: y) .descendant (" some ") là? Int ' – SimplGy
Cách tiếp cận' Mirror (phản xạ: x) .descendant (...) 'không hoạt động trong Swift 3 (' Mirror (phản ánh: x) .children.count' là '0'), nhưng' return x as ! T'! Đối với một số lý do kỳ lạ, cố gắng làm '(myAnyVar như! SCNRenderingAPI?)' Cho tôi một lỗi biên dịch thời gian 'lỗi: không thể downcast từ 'Bất kỳ' sang một loại tùy chọn hơn 'SCNRenderingAPI?'', Nhưng làm cùng một diễn viên bên trong một chức năng như bạn có nó hoạt động tuyệt vời. Chúc mừng! | Chỉnh sửa được đề xuất: _ “Hoặc bạn có thể làm điều này nếu bạn không thích Phản ánh:” _ → _ “Hoặc bạn có thể thực hiện việc này trong Swift 3 hoặc nếu bạn không thích Phản ánh:” _ –