Swift编程相对较新。
我得到一个字典,我需要从中获取用户名(名字和姓氏)并将其显示在表格视图单元格中以及其他数据。
在iPhone 5及以下版本中,由于屏幕宽度仅为320,因此要求只显示名字的第一个名称和第一个字符。
例如:“霍华德马克”到“霍华德M”
我确信有一种优雅的方式来提取所需的字符串。
struct ScreenSize
{
static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
}
struct DeviceType
{
static let IS_IPHONE_5_OR_LESS = (UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH <= 568.0)
}
func functionCall (referralData:[String: Any?])
{
var myMutableString = NSMutableAttributedString()
if var nameString = referralData[KEY_FULL_NAME]
{
if DeviceType.IS_IPHONE_5_OR_LESS
{
var a = nameString as? NSString
var arr = a?.components(separatedBy: " ")
let newStr = arr?[0] as? String
nameString = newStr
if((arr?.count)! > 1)
{
if let secondString = arr?[1]
{
let newStr2 = newStr as? NSString
let secondChar = newStr2?.character(at: 0)
let stringchar:String! = String(secondChar!)
nameString = "\(newStr!) \(stringchar)"
}
}
print("iPhone 5 or less")
}
else
{
print("Greater than iPhone 5")
}
}
}
答案 0 :(得分:0)
也许是这样的?
let fullName = "Dominik Pich"
var parts = fullName.components(separatedBy: " ")
if parts.count > 0,
let lastNameInitial = parts.last?.prefix(1) {
parts[parts.count-1] = String(lastNameInitial)
}
let truncatedName = parts.joined(separator: " ")
//use
print("fullName: \(fullName)")
print("truncatedName: \(truncatedName)")
我将它包装在一个很好的String扩展中 - 例如计算属性truncateLast
答案 1 :(得分:0)
我在使用Swift的内置子字符串命令时找到的最有用的答案是:https://stackoverflow.com/a/39677331/5495979
虽然使用substring命令仍然需要先获取范围或索引,所以仍然需要几个命令才能实现。
所以使用我在上面提到的SO答案中的首选方法,我只需获取第一个字符的索引并使用substring命令并将其强制转换为字符串:
let index = secondString.index(secondString.startIndex, offsetBy: 0)
let stringChar = String(secondString.substring(to: index))
我还想告诉您,在获取姓氏的第一个字母时,代码中似乎存在逻辑错误。您使用if let secondString = arr?[1]
打开字符串组件数组中的姓氏,但在解析secondString
之前,请不要将newStr2
中存储的解包字符串分配给newStr2
对于字符串中的第一个字符。现在看来,当您使用let secondChar = newStr2?.character(at: 0)
解析字符串的第一个字符时,您实际上将从第一个名称解析第一个字符(因为在使用let newStr2 = newStr as? NSString
分配newStr2时,您实际上正在分配第一个字符来自名称字符串数组,因为newStr只与let newStr = arr?[0] as? String
)
答案 2 :(得分:0)
我认为任何人都不应该再考虑Swift 3了。这是一个Swift 4示例:
var name = "Veeblefetzer Rumplestiltskin"
if let r = name.range(of: " ", options: .backwards, range: name.startIndex..<name.endIndex) {
name = String(name[name.startIndex..<name.index(r.upperBound, offsetBy: 1)])
}
name // "Veeblefetzer R"