ChatGPT回答的
1. 字符串根据固定宽度计算高度或根据固定高度计算宽度
- 根据宽度计算高度
func getHeight(for text: String, withFixedWidth width: CGFloat, font: UIFont, lineSpacing: CGFloat) -> CGFloat {
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
let attributes: [NSAttributedString.Key: Any] = [.font: font, .paragraphStyle: paragraphStyle]
let attributedText = NSAttributedString(string: text, attributes: attributes)
let boundingRect = attributedText.boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil)
return ceil(boundingRect.height)
}
- 根据高度计算宽度
func getWidth(for text: String, withHeight height: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
let boundingRect = text.boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [.font: font], context: nil)
return ceil(boundingRect.width)
}
2. swift 判断一个Double的小数点后面的数是否大于0
let myDouble = 3.14159265359
let myString = String(myDouble)
if let decimalIndex = myString.firstIndex(of: ".") {
let decimalPart = myString[decimalIndex...]
if let decimalValue = Double(decimalPart), decimalValue > 0 {
print("Decimal value is greater than 0: \(decimalValue)")
} else {
print("Decimal value is not greater than 0 or could not be converted to a Double")
}
} else {
print("No decimal point found in string")
}
- 键盘连续输入三次小数点,前面的数字会变为三个点,解决方案
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let updatedText = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) ?? ""
let dotCount = updatedText.components(separatedBy: ".").count - 1
if string == "." && dotCount >= 2 {
return false // 阻止输入第三个小数点
}
return true
}
3. data转String
import Foundation
class DataTool {
static func stringToNSData(srcString: String) -> Data? {
let bytes = srcString.components(separatedBy: ":")
let data = bytes.compactMap { byte in
return UInt8(byte, radix: 16)
}
return Data(data)
}
static func nsDataToArray(srcData: Data) -> [String] {
let bytes = [UInt8](srcData)
let hexStrings = bytes.map { byte in
return String(format: "%02X", byte)
}
// 在字符串数组中的每个元素之间插入冒号
let result = stride(from: 0, to: hexStrings.count, by: 2).map { index in
return hexStrings[index] + hexStrings[index + 1]
}.joined(separator: ":")
return [result]
}
}
let macString = "AA:BB:CC:DD:EE:FF"
let macData = DataTool.stringToNSData(srcString: macString)
print("【测试转换】转换前字符串:\(macString)")
let changeString = DataTool.nsDataToArray(srcData: macData ?? Data())
print("【测试转换】转换后字符串:\(changeString)")
4. Int8 和 UInt8互转
// 1. OC写法,把UInt8转Int8
NSMutableArray<NSNumber *> *arr = [NSMutableArray array];
for (NSNumber *element in srcArr) {
int8_t temp = (int8_t)[element unsignedCharValue];
[arr addObject:@(temp)];
}
// 2. swift写法,把UInt8转Int8
var arr = [Int8]()
for element in srcArr {
let temp = numericCast(element)
let newE = Int8(bitPattern: temp)
arr.append(newE)
}
// 3. OC写法,把Int8转UInt8
NSMutableArray<NSNumber *> *arr = [NSMutableArray array];
for (NSNumber *element in tempArr) {
NSUInteger temp = [element unsignedIntegerValue] & 0xFF;
NSNumber *newE = @(temp);
[arr addObject:newE];
}
// 4. swift写法,把Int8转UInt8
var arr = [UInt8]()
for element in tempArr {
let temp = element.uintValue & 0xFF
let newE = UInt8(temp)
arr.append(newE)
}
// 5. 取值范围为0~255的Int转为Int8后,再转为Int
arr = arr.map { Int(Int8(bitPattern: UInt8($0)))}
// 转换前:[152, 0, 0, 129, 209, 177]
// 转换后:[-104, 0, 0, -127, -47, -79]