Динамический тип в Свифт 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)
{
}