Определение явного преобразования для пользовательских типов в Swift
В настоящее время лучший/предпочтительный способ определения явных преобразований в Swift? В верхней части головы я могу думать о двух:
-
Создание пользовательских инициализаторов для типа назначения через расширение, например:
extension String {
init(_ myType: MyType) {
self = "Some Value"
}
}
Таким образом, вы можете просто использовать String(m)
, где m имеет тип MyType
, чтобы преобразовать m в строку.
-
Определение toType
-Methods в исходном типе, например:
class MyType {
func toString() -> String {
return "Some Value"
}
}
Это сопоставимо с Swift String.toInt()
, которое возвращает Int?
. Но если бы это был окончательный путь, я бы ожидал, что для этого будут протоколы для базовых типов, такие как инверсия уже существующих протоколов *LiteralConvertible
.
Подпроцесс: ни один из двух методов не позволяет компилировать что-то подобное: let s: MyString = myTypeInstance (as String)
(часть в скобках необязательна), но если я правильно понимаю, оператор as
предназначен только для downcasting в иерархиях типов, это правильно?
Ответы
Ответ 1
Образец, используемый в swift, является инициализатором. Так, например, при преобразовании Int
в UInt
нам нужно написать:
var i: Int = 10
var u: UInt = UInt(i)
Я бы придерживался этого шаблона.
Что касается подзапроса, в документации указано, что:
Тип casting - это способ проверить тип экземпляра и/или обрабатывать этот экземпляр, как если бы он был другим суперклассом или подклассом из другого места в своей собственной иерархии классов.
и
Вы также можете использовать литье типов, чтобы проверить, соответствует ли тип протоколу
так что нет, ключевое слово as
не может использоваться для преобразования значения определенного типа в другой тип.
Это можно протестировать простым способом:
var i: Int = 10
var u: UInt = i as UInt
Это порождает ошибку:
'Int' is not convertible to 'UInt'
Подробнее о Тип Casting