CoreData Entityに文字列の属性 "message"があります。これはテキストを格納し、場合によってはURLを含みます。今私はエンティティからすべてのURLを取得する必要があります。NSExpressionを使用してカスタム関数でNSFetchRequest propertiesToFetchを設定する方法
let predicate = NSPredicate(format:"message CONTAINS[cd] %@", "http")
let fetchRequest = self.getfetchRequest(entityName: "Messages", sectionKey:nil, predicate:predicate)
let expressionDescription = NSExpressionDescription()
expressionDescription.name = "urlFromMsg"
expressionDescription.expressionResultType = .StringAttributeType
let expression = NSExpression(forFunction: "toUrl", arguments: [NSExpression(forKeyPath: "message")])
expressionDescription.expression = expression
fetchRequest.propertiesToFetch = [expressionDescription]
fetchRequest.resultType = NSFetchRequestResultType.DictionaryResultType
ここで、toUrlはStringを拡張するカスタム関数です。
extension String {
func toUrl()->[String]?{
let detector = try! NSDataDetector(types: NSTextCheckingType.Link.rawValue)
let matches = detector.matchesInString(self, options: [], range: NSRange(location: 0, length: self.utf16.count))
var urls = [String]()
for match in matches {
urls.append((self as NSString).substringWithRange(match.range))
}
return urls
}
}
私はNSExpressionで適切にカスタムメソッドを設定する方法
let expression = NSExpression(forFunction: "toUrl", arguments: [NSExpression(forKeyPath: "message")])
この行でクラッシュを取得しています。
http://useyourloaf.com/blog/core-data-queries-using-expressions/を参照してください。ただし、すべてのカスタム機能がCD互換です。 –