用于条件可选展开的Swift类型变量

时间:2016-01-27 19:09:57

标签: ios swift swift2

我正在尝试设置一个类型变量,然后用它来有条件地打开一个可选项。这是一个例子:

func testInt() {
    var test:Int? = 15

    let intType = Int.self

    if let testInt = test as? intType {
        print("is a int")
    } else {
        print("not a int")
    }
}

在上面的示例中,我收到'intType' is not a type的错误。

这甚至可以吗?

我也尝试了.Type,我也遇到了同样的错误。

编辑****

这是我想要做的一个例子。上面的例子只是一个在变量中存储类型的简单例子。我知道还有其他方法可以完成上述功能......

class TableCell0: UITableViewCell {}
class TableCell1: UITableViewCell {}

enum SectionInfo: Int {
    case section0 = 0, section1

    var cellIdentifier: String {
        let identifiers = ["Section0Cell", "Section1Cell"]
        return identifiers[self.rawValue]
    }

    var cellType: UITableViewCell.Type {
        let types:[UITableViewCell.Type] = [TableCell0.self, TableCell1.self]
        return types[self.rawValue]
    }
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    guard let sectionInfo = SectionInfo(rawValue: indexPath.section) else {
        fatalError("Unexpected section passed from tableView")
    }

    guard let cell = tableView.dequeueReusableCellWithIdentifier(sectionInfo.cellIdentifier, forIndexPath: indexPath) as? sectionInfo.cellType else {
        fatalError("unexpected cell dequeued from tableView")
    }
    return cell
}

这应该创建我想要的正确类型的单元格

4 个答案:

答案 0 :(得分:1)

我想我明白你要做什么。使用func testInt() { var test:Int = 15 let intType = Int.self if test.dynamicType == intType { print("is a int") } else { print("not a int") } } 进行比较,而不是有条件地展开可选项。

uploadLabReport.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
       pickImage();
    }
});

至少那个适用于你的Integer示例,不确定它是否适用于你的UITableViewCell示例。

答案 1 :(得分:0)

Int示例,

Screen

非Int示例,

Replace
我认为,因为编译器会让你知道你已经知道了这个类型。 AKA"总是失败"或者"总是成功"

答案 2 :(得分:0)

我不确定您要做什么,但如果您想检查变量是否为 int 类型,您可以使用

func testInt() {
    let test:Int? = 15

    // let intType = Int.self <-----comment this out. you dont need it

    if test! is Int {        //i'm force unwrapping "test!" cause you declared it as optional        
        print("is a int")
    } else {
        print("not a int")
    }
}

答案 3 :(得分:0)

func test<T>(type: T.Type) {
    let test:Int? = 15


    if let _ = test as? T {
        print("is a int")
    } else {
        print("not a int")
    }
}

test(Int)    // is a int
test(Double) // not a int

或......

func test<T>(type: T.Type, what: Any) {

    if let w = what as? T {
        print(w, "is a \(T.Type.self)")
    } else {
        print(what, "not a \(T.Type.self)")
    }
}

test(Int.self, what: 1)
test(Double.self, what: 1)
test(Double.self, what: 2.2)

/*
1 is a Int.Type
1 not a Double.Type
2.2 is a Double.Type
*/

根据您的笔记,您可以使用通用方法,仍然使用变量来“保存”#39;你的类型// test()来自第一个例子

let t1 = Int.self
let t2 = Double.self
test(t1)    // is a int
test(t2)    // not a int

t1和t2都是常量,t1的类型为Int.Type.Type,t2的类型为Double.Type.Type。你不能演员? t1还是? T2。