10

当试图从 a 中删除后缀时filename,我只剩下后缀,这完​​全不是我想要的。

我在这里做错了什么(多少事情):

let myTextureAtlas = SKTextureAtlas(named: "demoArt")

let filename = (myTextureAtlas.textureNames.first?.characters.split{$0 == "."}.map(String.init)[1].replacingOccurrences(of: "\'", with: ""))! as String

print(filename)

png是整个事情中最沉闷的部分。

4

10 回答 10

24

如果后缀是指路径扩展,则有一种方法:

let filename = "demoArt.png"
let name = (filename as NSString).deletingPathExtension
// name - "demoArt"
于 2019-10-17T12:21:47.320 回答
13

这里的一些人似乎忽略了文件名中可以​​有多个句点,在这种情况下,只有最后一个句点分隔文件扩展名。因此this.is.a.valid.image.filename.jpg,剥离扩展应该返回this.is.a.valid.image.filename而不是this(因为这里有两个答案会产生)或介于两者之间的任何其他东西。正则表达式答案可以正常工作,但使用正则表达式有点矫枉过正(可能比使用简单字符串处理慢 10 倍)。这是一个适用于所有人的通用函数:

func stripFileExtension ( _ filename: String ) -> String {
    var components = filename.components(separatedBy: ".")
    guard components.count > 1 else { return filename }
    components.removeLast()
    return components.joined(separator: ".")
}

print("1: \(stripFileExtension("foo"))")
print("2: \(stripFileExtension("foo.bar"))")
print("3: \(stripFileExtension("foo.bar.foobar"))")

输出:

foo
foo
foo.bar
于 2017-06-09T11:10:04.867 回答
11

您还可以使用 componentsSeparatedBy 拆分字符串,如下所示:

let fileName = "demoArt.png"
var components = fileName.components(separatedBy: ".")
if components.count > 1 { // If there is a file extension
  components.removeLast()
  return components.joined(separator: ".")
} else {
  return fileName
}

澄清:

fileName.components(separatedBy: ".")

将返回一个由“demoArt”和“png”组成的数组。

于 2016-10-06T05:28:19.490 回答
8

在 iOS Array 中以 0 开头,并且您想要不带扩展名的文件名,因此您使用 拆分字符串.,现在该名称将存储在第一个对象中,扩展名存储在第二个对象中。

简单示例

let fileName = "demoArt.png"
let name = fileName.characters.split(".").map(String.init).first
于 2016-10-06T05:08:35.863 回答
5

@Confused 与 Swift 4 你可以这样做:

let fileName = "demoArt.png"
// or on your specific case:
// let fileName = myTextureAtlas.textureNames.first

let name = String(fileName.split(separator: ".").first!)
print(name)

此外,您还应该打开包装first,但我不想使示例代码复杂化来解决您的问题。

顺便说一句,因为我最近也需要这个,如果你想删除你事先知道的特定后缀,你可以这样做:

let fileName = "demoArt.png"
let fileNameExtension = ".png"

if fileName.hasSuffix(fileNameExtension) {
    let name = fileName.prefix(fileName.count - fileNameExtension.count)
    print(name)
}
于 2017-12-07T10:46:44.913 回答
5

如果您不在乎扩展名是什么。这是一个简单的方法。

let ss = filename.prefix(upTo: fileName.lastIndex { $0 == "." } ?? fileName.endIndex))

在此之后,您可能希望将生成的子字符串转换为字符串。和String(ss)

于 2018-04-20T02:54:58.140 回答
3

使用.dropLast(k)where kis the number of characters you drop from the suffix 怎么样?

否则,为了从文件名中正确删除路径中的扩展名,我坚持你使用 URL 和.deletingPathExtension().lastPathComponent.

也许有点开销,但至少它是一个坚如磐石的 Apple API。

于 2019-06-19T09:21:58.583 回答
2

您还可以使用正则表达式提取最后一个点之前的所有部分,如下所示:

let fileName = "test.png"
let pattern  = "^(.*)(\\.[a-zA-Z]+)$"
let regexp = try! NSRegularExpression(pattern: pattern, options: [])
let extractedName = regexp.stringByReplacingMatches(in: fileName, options: [], range: NSMakeRange(0, fileName.characters.count), withTemplate: "$1")
print(extractedName) //test
于 2016-10-06T08:37:43.900 回答
2
let mp3Files = ["alarm.mp3", "bubbles.mp3", "fanfare.mp3"]
let ringtonsArray = mp3Files.flatMap { $0.components(separatedBy: ".").first }
于 2017-11-01T14:38:46.583 回答
2

您可以返回一个新字符串,从末尾删除一定数量的字符。

   let fileName = "demoArt.png"
   fileName.dropLast(4)

此代码返回“demoArt”

于 2019-10-16T15:28:16.530 回答