Я сталкиваюсь с несколькими странностями, пытаясь соответствовать StringLiteralConvertible:
class Person: StringLiteralConvertible {
var name = ""
init(name n:String){
name = n
}
init(stringLiteral value: StringLiteralType){
name = n
}
init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType){
name = n
}
init(unicodeScalarLiteral value: UnicodeScalarLiteralType){
name = n
}
}
var ironMan = Person(name: "Tony Stark")
var spiderMan: Person = "Peter Parker"
Я реализовал как протоколы ExtendedGraphemeClusterLiteralConvertible
, так и UnicodeScalarLiteralConvertible
(что на Земле означает это).
Однако я все еще получал ошибки и должен был давать определения как для ExtendedGraphemeClusterLiteralType
, так и UnicodeScalarLiteralType
:
typealias ExtendedGraphemeClusterLiteralType = String
typealias UnicodeScalarLiteralType = String
Почему я должен был предоставить это, если он уже находится в стандартном заголовке???
Компилятор считал, что он по-прежнему имеет право жаловаться и вынудил меня добавить ключевое слово required
в inits, хотя определение протоколов не включает ключевое слово required
! Почему????
Следующий код компилируется, но я не понимаю, почему первая версия не скомпилировалась!
class Person: StringLiteralConvertible {
var name = ""
init(name n:String){
name = n
}
typealias ExtendedGraphemeClusterLiteralType = String
typealias UnicodeScalarLiteralType = String
required convenience init(stringLiteral value: StringLiteralType){
self.init(name: value)
}
required convenience init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType){
self.init(name: value)
}
required convenience init(unicodeScalarLiteral value: UnicodeScalarLiteralType){
self.init(name: value)
}
}
Быстро, если вам нравится, когда компилятор кричит на вас, вам это понравится!:-P