선택적 문자열 확장자를 추가하는 방법은 무엇입니까?
다음과 같은 문자열 확장자를 만들 수 있습니다.
extension String {
func someFunc() -> Bool { return true }
}
하지만 만약 당신이 그것을 선택적 문자열에 적용하기를 원한다면요?
var optionalString: String? = ""
optionalString!.someFunc() /* String? does not have a member someFunc */
추가 시도 중extension String? {
다음 오류가 발생합니다.
제한된 확장은 'where' 절로 지정된 제약 조건을 사용하여 특수하지 않은 일반 유형 'Optional'에 선언해야 합니다.
Swift 3.1에서는 옵션 값에 확장을 추가할 수도 있습니다.
extension Optional where Wrapped == String {
var isBlank: Bool {
return self?.isBlank ?? true
}
}
extension Optional where Wrapped == String {
var isNil: Bool {
return self == nil
}
}
@Vlad Hatko님이 작성하신 위 답변은 잘 작동하지만 Swift 4에서는 몇 가지 문제가 있어서 이것으로 변경하였습니다.
다음과 같이 할 수 있습니다.
protocol OptionalType { typealias A; var opt: A? { get } }
extension Optional: OptionalType { var opt: A? { return self } }
protocol StringType { var get: String { get } }
extension String: StringType { var get: String { return self } }
extension Optional where Wrapped: StringType {
func getOrElse(s: String) -> String {
return self.opt?.get ?? s
}
}
그리고:
let optStr: String? = nil
optStr.getOrElse("hello world")
당신이 구속할 수 없는 이유는Optional
또는String
그 문제에 대해서는, 그들이 그러하기 때문입니다.struct
각각의 의사 프로토콜을 만듦으로써, 이제 우리는 우리가 원하는 대로 제약할 수 있습니다.
swift는 단지 초보자들이 배우기 쉽도록 하기 위해 많은 것을 포기했거나 아마도 언어가 아직 충분히 성숙하지 않은 것 같습니다.
확장 날짜Optional
그 답례로String
Swift 3부터는 확장 메서드를 선택적으로 직접 제한할 수 없습니다.String
Daniel Shin의 답변이 설명하는 것처럼 프로토콜로 동등한 결과를 얻을 수 있습니다.
그러나 모든 유형의 옵션에서 확장 방법을 만들 수 있으며 다음과 같은 유용한 방법을 찾았습니다.String
반환 가격이러한 확장은 값을 콘솔에 기록하는 데 유용합니다.에서 StringOrEmpty()로 사용했습니다.String
가능한 nil을 빈 문자열로 바꾸려는 경우 선택적입니다.
extension Optional {
func asStringOrEmpty() -> String {
switch self {
case .some(let value):
return String(describing: value)
case _:
return ""
}
}
func asStringOrNilText() -> String {
switch self {
case .some(let value):
return String(describing: value)
case _:
return "(nil)"
}
}
}
사용 예:
var booleanValue: Bool?
var stringValue: String?
var intValue: Int?
print("booleanValue: \(booleanValue.asStringOrNilText())")
print("stringValue: \(stringValue.asStringOrNilText())")
print("intValue: \(intValue.asStringOrNilText())")
booleanValue = true
stringValue = "text!"
intValue = 41
print("booleanValue: \(booleanValue.asStringOrNilText())")
print("stringValue: \(stringValue.asStringOrNilText())")
print("intValue: \(intValue.asStringOrNilText())")
콘솔 출력:
booleanValue: (nil)
stringValue: (nil)
intValue: (nil)
booleanValue: true
stringValue: text!
intValue: 41
Optional
0과(와) 다른 포인터
이러한 확장은 다음과 같은 것을 보여줍니다.Optional
제로 포인터와는 다릅니다.Optional
이다.enum
지정된 유형(Wrapped
값을 포함하거나 포함하지 않음을 나타냅니다.다음에 확장자를 작성할 수 있습니다.Optional
값을 포함하지 않을 수도 있지만 "continue".
스위프트 선택적 선언에서 발췌.
enum Optional<Wrapped> : ExpressibleByNilLiteral {
/// The absence of a value.
case none
/// The presence of a value, stored as `Wrapped`.
case some(Wrapped)
...
}
코드에서, 값의 부재는 일반적으로 다음을 사용하여 작성됩니다.nil
명시적이라기보다는 문자 그대로의.none
열거형 사건
Swift 4.1에서 저는 다음을 얻었습니다.Optional is ambiguous for type lookup in this context
빌드 오류수정하려면 다음 유형에 Swift 네임스페이스를 명시적으로 추가해야 합니다.
extension Swift.Optional where Wrapped == String {
var isBlank: Bool {
return self?.isBlank ?? true
}
}
Xcode 9.3 이후, 당신은 @Vladyslav의 대답을 약간 수정하여 사용할 수 있습니다.
extension Optional where Wrapped == String {
var isEmpty: Bool {
return self?.isEmpty ?? true
}
}
업데이트: Swift 2 이상에서 작동하는 해결 방법은 Daniel Shin의 답변을 참조하십시오.
선택적 문자열은 유형 자체가 아니므로 선택적 유형에 확장자를 만들 수 없습니다. 스프트에서위,▁an서.Optional
단지 열거형(그리고 약간의 통사적 설탕)일 뿐이며, 다음 중 하나일 수 있습니다.None
또는Some
값을 묶습니다.String 메서드를 사용하려면 다음과 같은 작업을 수행해야 합니다.optionalString
선택적 체인을 쉽게 사용하여 다음을 수행할 수 있습니다.
optionalString?.someFunc()
한다면optionalString
아닙니다nil
,someFunc
호출될 것입니다.이를 수행하는 대안적인(간단하지 않은) 방법은 선택적 바인딩을 사용하여 다음과 같은 작업을 수행하는지 여부를 확인하는 것입니다.optionalString
메서드를 호출하기 전에 값이 있습니다.
if let string = optionalString {
string.someFunc() // `string` is now of type `String` (not `String?`)
}
아래 의견의 예제에서는 여러 개를 중첩할 필요가 없습니다.if
문, 옵션 문자열이 단일의 빈 문자열인지 확인할 수 있습니다.if
:
if optionalString?.isEmpty == true {
doSomething()
}
이는 표현식이 작동하기 때문입니다.optionalString?.isEmpty
인 Bool 선인즉을Bool(다택, Bool))을 반환합니다.true
,false
또는nil
. 그래서.doSomething()
다음과 같은 경우에만 호출됩니다.optionalString
아닙니다 nil
그리고 만약 그 문자열이 비어 있다면.
또 다른 대안은 다음과 같습니다.
if let string = optionalString where string.isEmpty {
doSomethingWithEmptyString(string)
}
선택적 문자열 확장자를 만들 수 있습니다.선택적 문자열이 0인 경우 빈 문자열로 설정하기 위해 다음 작업을 수행했습니다.
extension Optional where Wrapped == String {
mutating func setToEmptyIfNil() {
guard self != nil else {
self = ""
return
}
}
}
트릭 스위프트를 찾았습니다 3.
class A{
var name:String!;
init(_ name:String?){
self.name = name;
}
}
extension Optional where Wrapped == String {
func compareText(_ other:String?)->Bool{
switch (self,other){
case let(a?,b?):
return a < b;
case (nil,_):
return true;
default:
return false;
}
}
}
let words:[A] = [A("a"),A(nil),A("b"),A("c"),A(nil)];
// let sorted = words.sorted{ 0.name.compareText($1.name) }
// trick
let sorted = words.sorted{ ($0.name as String?).compareText($1.name) }
print(sorted.map{$0.name});
언급URL : https://stackoverflow.com/questions/29462953/how-to-add-an-optional-string-extension
'code' 카테고리의 다른 글
jQuery 이벤트 처리기는 항상 바인딩된 순서대로 실행합니다. 이 문제를 해결할 방법이 있습니까? (0) | 2023.08.11 |
---|---|
비인터랙티브 모드의 파워셸 (0) | 2023.08.11 |
Chrome 콘솔이 열려 있는지 확인합니다. (0) | 2023.08.11 |
ER 다이어그램이 Datagrip에 관계를 표시하지 않음 (0) | 2023.08.11 |
MariaDB 연결이 임의로 실패하지만 계속 유지됨 (0) | 2023.08.11 |