extension NSMutableAttributedString {
private
func check(_ range: inout NSRange) {
if range.location + range.length > string.
count {
range =
NSRange(location: range.location, length: string.
count - range.location)
}
}
private
var allRange :
NSRange {
return
NSRange(location:
0, length: string.
count)
}
}
extension NSMutableAttributedString {
subscript<
T>(
_ key:
NSAttributedString.
Key) ->
T? {
get {
var range = allRange
return attribute(key, at:
0, effectiveRange: &range)
as?
T
}
set {
if
let value = newValue {
let range = allRange
addAttribute(key, value: value, range: range)
}
}
}
}
extension NSMutableAttributedString {
subscript<
T>(
_ key:
NSAttributedString.
Key, r:
Range<
Int>) ->
T? {
get {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound)
check(&range)
return attribute(key, at:
0, effectiveRange: &range)
as?
T
}
set {
if
let value = newValue {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound)
check(&range)
addAttribute(key, value: value, range: range)
}
}
}
subscript<
T>(
_ key:
NSAttributedString.
Key, r:
Range<
String.
Index>) ->
T? {
get {
let lowerBound = r.lowerBound.encodedOffset
let upperBound = r.upperBound.encodedOffset
var range =
NSRange(location: lowerBound, length: upperBound - lowerBound)
check(&range)
return attribute(key, at:
0, effectiveRange: &range)
as?
T
}
set {
if
let value = newValue {
let lowerBound = r.lowerBound.encodedOffset
let upperBound = r.upperBound.encodedOffset
var range =
NSRange(location: lowerBound, length: upperBound - lowerBound)
check(&range)
addAttribute(key, value: value, range: range)
}
}
}
subscript<
T>(
_ r:
Range<
Int>) -> [
NSAttributedString.
Key:
T]? {
get {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound)
check(&range)
var dict : [
NSAttributedString.
Key:
T] = [:]
enumerateAttributes(
in: range, options: .longestEffectiveRangeNotRequired) { (atts, range, pointer)
in
dict = atts
as! [
NSAttributedString.
Key :
T]
}
return dict
}
set {
if
let value = newValue {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound)
check(&range)
value.forEach {
addAttribute($
0, value: $
1, range: range)
}
}
}
}
}
extension NSMutableAttributedString {
subscript<
T>(
_ key:
NSAttributedString.
Key, r:
ClosedRange<
Int>) ->
T? {
get {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound +
1)
check(&range)
return attribute(key, at:
0, effectiveRange: &range)
as?
T
}
set {
if
let value = newValue {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound +
1)
check(&range)
addAttribute(key, value: value, range: range)
}
}
}
subscript<
T>(
_ r:
ClosedRange<
Int>) -> [
NSAttributedString.
Key:
T]? {
get {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound +
1)
check(&range)
var dict : [
NSAttributedString.
Key:
T] = [:]
enumerateAttributes(
in: range, options: .longestEffectiveRangeNotRequired) { (atts, range, pointer)
in
dict = atts
as! [
NSAttributedString.
Key :
T]
}
return dict
}
set {
if
let value = newValue {
var range =
NSRange(location: r.lowerBound, length: r.upperBound - r.lowerBound +
1)
check(&range)
value.forEach {
addAttribute($
0, value: $
1, range: range)
}
}
}
}
}
extension NSMutableAttributedString {
subscript<
T>(
_ key:
NSAttributedString.
Key, r:
PartialRangeFrom<
Int>) ->
T? {
get {
var range =
NSRange(location: r.lowerBound, length: string.
count - r.lowerBound)
check(&range)
return attribute(key, at:
0, effectiveRange: &range)
as?
T
}
set {
if
let value = newValue {
var range =
NSRange(location: r.lowerBound, length: string.
count - r.lowerBound)
check(&range)
addAttribute(key, value: value, range: range)
}
}
}
subscript<
T>(
_ r:
PartialRangeFrom<
Int>) -> [
NSAttributedString.
Key:
T]? {
get {
var range =
NSRange(location: r.lowerBound, length: string.
count - r.lowerBound)
check(&range)
var dict : [
NSAttributedString.
Key:
T] = [:]
enumerateAttributes(
in: range, options: .longestEffectiveRangeNotRequired) { (atts, range, pointer)
in
dict = atts
as! [
NSAttributedString.
Key :
T]
}
return dict
}
set {
if
let value = newValue {
var range =
NSRange(location: r.lowerBound, length: string.
count - r.lowerBound)
check(&range)
value.forEach {
addAttribute($
0, value: $
1, range: range)
}
}
}
}
}