Динамический тип в Свифт 3

Я перенес свою версию swift с 2.3 на 3, и она автоматически преобразовала некоторый код, ниже приведен случай, когда у меня происходит сбой, я пробовал некоторые варианты, но тщетно,

Swift 2.3:отлично работает

public func huntSuperviewWithClassName(className: String) -> UIView?
{
    var foundView: UIView? = nil

    var currentVeiw:UIView? = self

    while currentVeiw?.superview != nil{
        if let classString = String.fromCString(class_getName(currentVeiw?.dynamicType)){

            if let classNameWithoutPackage = classString.componentsSeparatedByString(".").last{
                print(classNameWithoutPackage)
                if classNameWithoutPackage == className{
                    foundView = currentVeiw
                    break
                }
            }
        }
        currentVeiw = currentVeiw?.superview
    }

    return foundView
}

}

Свифт 3: не хорошо

  if let classString = String(validatingUTF8: class_getName(type(of:currentVeiw) as! AnyClass)) {

Пробовал эту строку тоже:

  if let classString = String(describing: class_getName(type(of: currentVeiw) as! AnyClass)){

но это не работает..

пожалуйста, подскажите, как исправить эту строку согласно swift 3:

 if let classString = String.fromCString(class_getName(currentVeiw?.dynamicType)){

4 ответа

Решение

Компилятор говорит вам, что вы не можете использовать if let потому что это совершенно не нужно. У вас нет опций, чтобы развернуть.if let используется исключительно для распаковки опций.

public func huntSuperviewWithClassName(className: String) -> UIView?
{
    var foundView: UIView? = nil

    var currentVeiw:UIView? = self

    while currentVeiw?.superview != nil{

            let classString = NSStringFromClass((currentVeiw?.classForCoder)!)

            if let classNameWithoutPackage = classString.components(separatedBy:".").last{
                print(classNameWithoutPackage)
                if classNameWithoutPackage == className{
                    foundView = currentVeiw
                    break
                }
            }
        }
        currentVeiw = currentVeiw?.superview
    }

    return foundView
}

работает отлично!

Просто сделайте это:

let classString = String(describing: type(of: currentVeiw!))

Попробуйте следующее:

public func huntSuperviewWithClassName(className: String) -> UIView?
{
    var foundView: UIView? = nil
    var currentVeiw:UIView? = self
    while currentVeiw?.superview != nil{
        let classString = String(describing: type(of: currentVeiw?.classForCoder))
        if let classNameWithoutPackage = classString.components(separatedBy:".").first {
            print(classNameWithoutPackage)
            if classNameWithoutPackage == className {
                foundView = currentVeiw
                break
            }
        }
        currentVeiw = currentVeiw?.superview
    }
    return foundView
}
if let classString = String(describing: currentVeiw.self) 
{
}
Другие вопросы по тегам