Swift 3의 구현 인 #keyPath()
을 발견하게되어 매우 기뻤습니다. 오타가 제거되고 컴파일시에 키 경로가 실제로 존재하게됩니다. 수동으로 문자열을 입력하는 것보다 훨씬 낫습니다. #keyPath()에 전달 된 문자열이 아닌 "속성 이름"을 독립적으로 저장할 수 있습니까?
class MyObject {
@objc var myString: String = "default"
}
// Works great
let keyPathString = #keyPath(MyObject.myString)
https://github.com/apple/swift-evolution/blob/master/proposals/0062-objc-keypaths.md
는 "속성 이름"으로#keyPath()
에 전달된다.
속성 이름
대물-C 런타임에서 사용할 수있는 속성을 참조해야한다. 컴파일시 키 - 경로 표현식은 문자열 리터럴로 대체됩니다.
이 "속성 이름"을 독립적으로 저장 한 다음 나중에 #keyPath()
으로 전달하여 문자열을 만들 수 있습니까?
let propertyName = MyObject.myString // error. How do I save?
let string = #keyPath(propertyName)
특정 유형에 속하는 속성 이름을 요구하는 지원이 있습니까?
// something like this
let typedPropertyName: MyObject.PropertyName = myString // error
let string = #keyPath(typedPropertyName)
최종 목표는 키 경로에 대한 NSExpression
을 필요로하는 API와 상호 작용한다. 임의의 키 경로 문자열 대신 유효한 속성 이름을 매개 변수로 사용하는 편리한 메서드를 작성하고 싶습니다. 이상적으로는 특정 유형에 의해 구현 된 속성 이름입니다.
func doSomethingForSpecificTypeProperty(_ propertyName: MyObject.PropertyName) {
let keyPathString = #keyPath(propertyName)
let expression = NSExpression(forKeyPath: keyPathString)
// ...
}
스위프트 4의 : 당신은 이러한 목적
빠른 4 이것에 대한 짧은 코드는 다음과 같습니다에 대한 에게 일반적인 키 패스을 사용할 수 있습니다 [스마트 KeyPaths : 더 나은 키 - 값은 스위프트에 대한 코딩] :/(HTTPS /github.com/apple/swift-evolution/blob/master/proposals/0161-key-paths.md) 더 나은 옵션이 추가 된 것 같습니다. 누군가 그것에 도착하기 전에 그것을 쓰고 싶다면 그 대답을 받아 들일 것입니다. – pkamb
https://bugs.swift.org/browse/SR-5220 - "KeyPath의 문자열 표현을 검색하기위한 API 공개" – pkamb
https://github.com/kishikawakatsumi/Kuery - "다음을 사용하는 유형 안전 핵심 데이터 쿼리 API Swift 4의 Smart KeyPaths " – pkamb