我正在尝试确定给定的type t(Any.Type)是否是可选类型,我正在使用此测试
t is Optional<Any>.Type
Run Code Online (Sandbox Code Playgroud)
但它总是返回false.
有没有办法实现这个目标?
是否可以检查变量是否是可选的,以及它包装的是什么类型?
可以检查变量是否是特定的可选:
let someString: String? = "oneString"
var anyThing: Any = someString
anyThing.dynamicType // Swift.Optional<Swift.String>
anyThing.dynamicType is Optional<String>.Type // true
anyThing.dynamicType is Optional<UIView>.Type // false
Run Code Online (Sandbox Code Playgroud)
但是有可能再次检查任何类型的可选项吗?就像是:
anyThing.dynamicType is Optional.Type // fails since T cant be inferred
// or
anyThing.dynamicType is Optional<Any>.Type // false
Run Code Online (Sandbox Code Playgroud)
一旦知道你有一个可选的,检索它包装的类型:
// hypothetical code
anyThing.optionalType // returns String.Type
Run Code Online (Sandbox Code Playgroud) 假设我有一段这样的代码:
let x: Int? = 10
let y: Any = x
Run Code Online (Sandbox Code Playgroud)
现在我想把y转换成Int?:
let z = y as Int? // Error: Cannot downcast from 'Any' to a more optional type 'Int?'
Run Code Online (Sandbox Code Playgroud)
这是不可能还是有另一种方式?
我正在摆弄Swift中的泛型并找到一些我无法弄清楚的东西:如果我将一个值转换为泛型参数的类型,则不会执行强制转换.如果我尝试使用静态类型,它可以工作.
class SomeClass<T> {
init?() {
if let _ = 4 as? T {
println("should work")
} else {
return nil
}
}
}
if let _ = SomeClass<Int?>() {
println("not called")
}
if let _ = 4 as? Int? {
println("works")
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这种行为吗?这两种情况不应该相同吗?
以上示例简化为最大值.以下示例说明了需要更好的演员表
class SomeClass<T> {
init?(v: [String: AnyObject]) {
if let _ = v["k"] as? T? {
print("should work")
} else {
print("does not")
return nil
}
}
}
if let _ = SomeClass<Int?>(v: ["k": 4]) …Run Code Online (Sandbox Code Playgroud) 我有几个类似于以下类似的快速类
public class Book {
var title: String?
var date: NSDate?
}
Run Code Online (Sandbox Code Playgroud)
由于我需要访问属性的几个不同的类,我使用反射来运行类的属性:
let myBook = Book()
myBook.title = "Hello"
myBook.date = NSDate()
let mirror = Mirror(reflecting: myBook)
var propsArr = [(key: String?, value: Any)]()
let mirrorChildrenCollection = AnyRandomAccessCollection(mirror.children)!
if mirrorChildrenCollection.count > 0 {
propsArr += mirrorChildrenCollection
}
//iterate through properties
for case let (label?, value) in propsArr {
print (label, value)
if let val = value as? NSDate {
var extractedDate = val
print(extractedDate)
}
else if let val …Run Code Online (Sandbox Code Playgroud)