Swift의 OptionSetType
프로토콜의 목적은 무엇이며, Set
을 활용하여 SetAlgebraType
방법을 사용하는 것과 어떻게 다른가요?OptionSetType 프로토콜 Swift
답변
OptionSetType
을 사용할 때 실용적인 관점에서 대답하겠습니다. 나에게 OptionSetType
의 목적은 C/ObjC의 모든 비트 조작을 제거하는 것이다.
직사각형의 테두리를 그리는 함수가있는 경우를 예로 들어보십시오. 사용자는 0에서 4 사이의 테두리를 그리도록 요청할 수 있습니다.
struct BorderType: OptionSetType {
let rawValue: Int
init (rawValue: Int) { self.rawValue = rawValue }
static let Top = BorderType(rawValue: 1 << 0)
static let Right = BorderType(rawValue: 1 << 1)
static let Bottom = BorderType(rawValue: 1 << 2)
static let Left = BorderType(rawValue: 1 << 3)
}
func drawBorder(border: BorderType) {
// Did the user ask for a Left border?
if border.contains(.Left) { ... }
// Did the user ask for both Top and Bottom borders?
if border.contains([.Top, .Bottom]) { ... }
// Add a Right border even if the user didn't ask for it
var border1 = border
border1.insert(.Right)
// Remove the Bottom border, always
var border2 = border
border2.remove(.Bottom)
}
drawBorder([.Top, .Bottom])
그리고 C에서
:typedef enum {
BorderTypeTop = 1 << 0,
BorderTypeRight = 1 << 1,
BorderTypeBottom = 1 << 2,
BorderTypeLeft = 1 << 3
} BorderType;
void drawBorder(BorderType border) {
// Did the user ask for a Left border?
if (border & BorderTypeLeft) { ... }
// Did the user ask for both Top and Bottom borders?
if ((border & BorderTypeTop) && (border & BorderTypeBottom)) { ... }
// Add a Right border even if the user didn't ask for it
border |= BorderTypeRight;
// Remove the Bottom border, always
border &= ~BorderTypeBottom;
}
int main (int argc, char const *argv[])
{
drawBorder(BorderTypeTop | BorderTypeBottom);
return 0;
}
C가 한 눈에, 짧은하지만,이 라인이 무엇을 말할 수
여기 스위프트의 코드는?
border &= ~BorderTypeBottom;
이 즉시 의미가 있지만 :
var border2 = border
border2.remove(.Bottom)
그것은 표현 인의 스위프트의 목표에 맞는, 언어를 배울 그것은 다릅니다 C.
의 스파르타의 철학OptionSetType
당신이 당신의 클래스 RawRepresentable
, 그리고 원시 표현 BitwiseOperationsType
라고 가정하면, 클래스는 아무것도 실행하지 않고 SetAlgebraType
을 준수 할 수 있습니다. nine methods에 기본 구현을 제공하여 SetAlgebraType
을 제공합니다.
Set
과 큰 차이점은 많은 수의 유형에 대해 쓸 필요가 없다는 것입니다. 정수형. 원시 표현 가능 유형을 OptionSetType
과 일치 시키면 모든 구현을 무료로 얻을 수 있습니다.
비교하기 쉬운 세트는 이 아니라 세트입니다. 값이 비트 마스크 인 Objective-C 열거 형입니다. 개념은 Swift에 이러한 열거 형을 가져 오는 방법을 제공하여 Set와 같은 편의성과 안전성으로 조작 할 수있는 방법을 제공하지만 실제로는 비트 단위 및 비트 단위를 사용하여 정수를 형성합니다. Objective-C에서 정수를 직접 생성해야합니다. 실제로는 bitwise-or 연산자를 사용합니다. 그러나 스위프트는 그렇게하지 않아도됩니다.
따라서, 당신은 은는 말할 수 :
let val =
UIViewAnimationOptions.Autoreverse.rawValue |
UIViewAnimationOptions.Repeat.rawValue
let opts = UIViewAnimationOptions(rawValue: val)
... 그리고 오브젝티브 C에서, 당신은 사실상 그렇게 할 것입니다. 그러나 Swift를 사용하면 대신 다음과 같이 말할 수 있습니다.
var opts = UIViewAnimationOptions.Autoreverse
opts.insert(.Repeat)
- 1. Swift - UITableView 프로토콜 추가
- 2. Swift 프로토콜 객체의 ARC
- 3. Swift : 프로토콜 적합성 -이 버그입니까?
- 4. 프로토콜 및 확장 프로그램 swift
- 5. 스위프트 OptionSetType 비트 단위-또는
- 6. swift 3.0 - UITextFieldDelegate 프로토콜 확장이 작동하지 않습니다.
- 7. Swift 3 업그레이드에 대한 프로토콜 폐기
- 8. iOS Swift 프로토콜 인스턴스 생성 방법
- 9. 스위프트 (Swift) : 프로토콜 대 구조 대 클래스
- 10. Objective-C 클래스에서 Swift 프로토콜 가져 오기
- 11. Swift 클래스에서 Objective-C 프로토콜 구현
- 12. swift 및 optionSetType 구조 값에 다음 코드를 사용하여 인수 유형을 거부하는 이유는 무엇입니까?
- 13. 스위프트 (Swift) : 어떤 프로토콜 방법과 속성을 실제로 구현해야하는지 파악하고 있습니까?
- 14. Swift : 실제 유형의 배열을 프로토콜 유형의 배열로 변환하십시오.
- 15. 프로토콜 내 UIView.animateWithDuration 사용
- 16. ObjC 프로토콜의 프로토콜 확장
- 17. 프로토콜 확장 프로토콜
- 18. 클래스이 내 프로토콜 프로토콜
- 19. _ArrayType은 Swift 3에 들어갔습니까?
- 20. 프로토콜
- 21. Swift Siesta 및 NSURLSession
- 22. 스위프트 2.2 배열 [문자열 : 없음] 프로토콜
- 23. 스위프트 옵션 프로토콜 동작 불일치
- 24. NSFetchRequestResult를 준수하는 프로토콜 확장
- 25. Swift 코드를 Swift 3.0으로 마이그레이션
- 26. xcode swift AnyObject to Swift
- 27. 무 상태 프로토콜 및 상태 저장 프로토콜
- 28. Apache Storm 다중 프로토콜 프로토콜 Acking
- 29. Swift NSXMLParserDelegate가 호출되지 않습니다.
- 30. 는 뷰 모델 또는 프로토콜